stormcloud-video-player 0.3.59 → 0.3.61

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.
@@ -1 +1 @@
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","getClientInfo","mod","value","tracking_exports","getBrowserID","sendAdDetectTracking","sendAdImpressionTracking","sendHeartbeat","sendInitialTracking","screen","orientation","type","sendAdLoadedTracking","module","exports","cachedBrowserId","ua","navigator","userAgent","window","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","width","height","availWidth","availHeight","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","includes","webosMatch","match","tizenMatch","tvMatch","trim","test","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","substring"],"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}\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 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}\nvar TRACK_API_URL = \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\";\nfunction mapToAdTrackingSource(source, adPlayerType) {\n if (source === \"prebid\" || source === \"ima\" || source === \"hls\") {\n return source;\n }\n if (source === \"preload\" || source === \"ssp\") {\n return source === \"ssp\" ? \"prebid\" : \"ima\";\n }\n return adPlayerType === \"hls\" ? \"hls\" : \"ima\";\n}\nasync function postAdTracking(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_API_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 sendAdDetectTracking(licenseKey, payload) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const adDetectInfo = {\n source: payload.source ?? \"scte35\",\n timestamp: payload.timestamp ?? (/* @__PURE__ */ new Date()).toISOString(),\n ...payload.durationSeconds != null && { durationSeconds: payload.durationSeconds },\n ...payload.ptsSeconds != null && { ptsSeconds: payload.ptsSeconds },\n ...payload.detectedAtFragmentSn != null && { detectedAtFragmentSn: payload.detectedAtFragmentSn }\n };\n const body = {\n browserId,\n ...clientInfo,\n ...licenseKey && { licenseKey },\n adDetectInfo\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-detect tracking:\", error);\n }\n}\nasync function sendAdLoadedTracking(licenseKey, payload, adPlayerType) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adLoadedInfo = {\n source,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n ...payload.vastUrl != null && { vastUrl: payload.vastUrl },\n ...payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }\n };\n const body = {\n browserId,\n ...clientInfo,\n ...licenseKey && { licenseKey },\n adLoadedInfo\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-loaded tracking:\", error);\n }\n}\nasync function sendAdImpressionTracking(licenseKey, payload, adPlayerType) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adImpressionInfo = {\n source,\n adIndex: payload.adIndex,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n ...payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }\n };\n const body = {\n browserId,\n ...clientInfo,\n ...licenseKey && { licenseKey },\n adImpressionInfo\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-impression tracking:\", 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 AdTrackingSource,\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\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\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\nconst TRACK_API_URL =\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\";\n\nfunction mapToAdTrackingSource(\n source: string | undefined,\n adPlayerType?: \"ima\" | \"hls\"\n): AdTrackingSource {\n if (source === \"prebid\" || source === \"ima\" || source === \"hls\") {\n return source;\n }\n if (source === \"preload\" || source === \"ssp\") {\n return source === \"ssp\" ? \"prebid\" : \"ima\";\n }\n return adPlayerType === \"hls\" ? \"hls\" : \"ima\";\n}\n\nasync function postAdTracking(\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_API_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 sendAdDetectTracking(\n licenseKey: string | undefined,\n payload: Omit<AdDetectInfo, \"source\" | \"timestamp\"> & Partial<Pick<AdDetectInfo, \"source\" | \"timestamp\">>\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const adDetectInfo: AdDetectInfo = {\n source: payload.source ?? \"scte35\",\n timestamp: payload.timestamp ?? new Date().toISOString(),\n ...(payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }),\n ...(payload.ptsSeconds != null && { ptsSeconds: payload.ptsSeconds }),\n ...(payload.detectedAtFragmentSn != null && { detectedAtFragmentSn: payload.detectedAtFragmentSn }),\n };\n const body = {\n browserId,\n ...clientInfo,\n ...(licenseKey && { licenseKey }),\n adDetectInfo,\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-detect tracking:\", error);\n }\n}\n\nexport async function sendAdLoadedTracking(\n licenseKey: string | undefined,\n payload: Omit<AdLoadedInfo, \"timestamp\" | \"source\"> & { source?: AdTrackingSource | string },\n adPlayerType?: \"ima\" | \"hls\"\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adLoadedInfo: AdLoadedInfo = {\n source,\n timestamp: new Date().toISOString(),\n ...(payload.vastUrl != null && { vastUrl: payload.vastUrl }),\n ...(payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }),\n };\n const body = {\n browserId,\n ...clientInfo,\n ...(licenseKey && { licenseKey }),\n adLoadedInfo,\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-loaded tracking:\", error);\n }\n}\n\nexport type AdImpressionTrackingPayload = {\n adIndex: number;\n source?: AdTrackingSource | string;\n durationSeconds?: number;\n};\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n payload: AdImpressionTrackingPayload,\n adPlayerType?: \"ima\" | \"hls\"\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const source = mapToAdTrackingSource(payload.source, adPlayerType);\n const adImpressionInfo: AdImpressionInfo = {\n source,\n adIndex: payload.adIndex,\n timestamp: new Date().toISOString(),\n ...(payload.durationSeconds != null && { durationSeconds: payload.durationSeconds }),\n };\n const body = {\n browserId,\n ...clientInfo,\n ...(licenseKey && { licenseKey }),\n adImpressionInfo,\n };\n await postAdTracking(licenseKey, body);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending ad-impression tracking:\", error);\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/tracking.cjs","../../src/utils/tracking.ts"],"names":["name","all","__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","get","enumerable","__copyProps","to","from","except","desc","key","value","mod","tracking_exports","getBrowserID","call","getClientInfo","sendAdDetectTracking","sendAdImpressionTracking","sendAdLoadedTracking","sendHeartbeat","sendInitialTracking","module","exports","__toCommonJS","cachedBrowserId","screen","window","navigator","ua","userAgent","platform","vendor","maxTouchPoints","deviceMemory","hardwareConcurrency","screenInfo","width","height","memory","availWidth","availHeight","orientation","type","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","includes","webosMatch","match","tvMatch","tizenMatch","trim","test","androidModelMatch","outerHeight","outerWidth","domain","substring","location","hostname","origin","language","languages","join","cookieEnabled","doNotTrack"],"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 PLAYER_TRACKING_BASE_URL = \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking\";\nvar TRACK_URL = `${PLAYER_TRACKING_BASE_URL}/metrics/ingest`;\nvar HEARTBEAT_URL = `${PLAYER_TRACKING_BASE_URL}/heartbeat`;\nvar IMPRESSIONS_URL = `${PLAYER_TRACKING_BASE_URL}/impressions/ingest`;\nfunction buildHeaders(licenseKey) {\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n return headers;\n}\nasync function sendTrackRequest(licenseKey, body) {\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\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 postJson(url, licenseKey, body) {\n const response = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\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 buildPlayerMetricEvent(licenseKey, context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: browserId,\n browserId,\n device_type: clientInfo.deviceType,\n deviceType: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: flags.adLoaded,\n ad_detect: flags.adDetect,\n license_key: licenseKey,\n capture_at: captureAt,\n timestamp: captureAt\n };\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = {\n browserId,\n ...clientInfo\n };\n await sendTrackRequest(licenseKey, {\n events: [\n {\n player_id: browserId,\n device_type: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: false,\n ad_detect: false,\n license_key: licenseKey,\n capture_at: (/* @__PURE__ */ new Date()).toISOString()\n }\n ],\n trackingData\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n try {\n const metricEvent = await buildPlayerMetricEvent(licenseKey, context, {\n captureAt: adImpressionInfo.timestamp\n });\n await Promise.all([\n postJson(HEARTBEAT_URL, licenseKey, metricEvent),\n postJson(IMPRESSIONS_URL, licenseKey, {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n license_key: licenseKey,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n })\n ]);\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n try {\n const heartbeatData = await buildPlayerMetricEvent(\n licenseKey,\n context,\n flags\n );\n await postJson(HEARTBEAT_URL, licenseKey, heartbeatData);\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 AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n PlayerAnalyticsContext,\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 PLAYER_TRACKING_BASE_URL =\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking\";\nconst TRACK_URL = `${PLAYER_TRACKING_BASE_URL}/metrics/ingest`;\nconst HEARTBEAT_URL = `${PLAYER_TRACKING_BASE_URL}/heartbeat`;\nconst IMPRESSIONS_URL = `${PLAYER_TRACKING_BASE_URL}/impressions/ingest`;\n\ntype PlayerMetricFlags = {\n adLoaded?: boolean;\n adDetect?: boolean;\n captureAt?: string;\n};\n\nfunction buildHeaders(licenseKey: string | undefined): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n return headers;\n}\n\nasync function sendTrackRequest(\n licenseKey: string | undefined,\n body: Record<string, unknown>\n): Promise<void> {\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\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\nasync function postJson(\n url: string,\n licenseKey: string | undefined,\n body: Record<string, unknown>\n): Promise<void> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(licenseKey),\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\nasync function buildPlayerMetricEvent(\n licenseKey: string | undefined,\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const captureAt = flags.captureAt ?? new Date().toISOString();\n\n return {\n player_id: browserId,\n browserId,\n device_type: clientInfo.deviceType,\n deviceType: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: flags.adLoaded,\n ad_detect: flags.adDetect,\n license_key: licenseKey,\n capture_at: captureAt,\n timestamp: captureAt,\n };\n}\n\nexport async function sendInitialTracking(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {}\n): 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 await sendTrackRequest(licenseKey, {\n events: [\n {\n player_id: browserId,\n device_type: clientInfo.deviceType,\n input_stream_type: context.inputStreamType,\n os: clientInfo.os,\n ad_loaded: false,\n ad_detect: false,\n license_key: licenseKey,\n capture_at: new Date().toISOString(),\n },\n ],\n trackingData,\n });\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 context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp,\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 context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n adImpressionInfo: AdImpressionInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n const metricEvent = await buildPlayerMetricEvent(licenseKey, context, {\n captureAt: adImpressionInfo.timestamp,\n });\n await Promise.all([\n postJson(HEARTBEAT_URL, licenseKey, metricEvent),\n postJson(IMPRESSIONS_URL, licenseKey, {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n license_key: licenseKey,\n capture_at: adImpressionInfo.timestamp,\n },\n ],\n }),\n ]);\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<void> {\n try {\n const heartbeatData = await buildPlayerMetricEvent(\n licenseKey,\n context,\n flags\n );\n await postJson(HEARTBEAT_URL, licenseKey, heartbeatData);\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n"]}
@@ -1,18 +1,16 @@
1
- import { A as AdTrackingSource, C as ClientInfo, a as AdDetectInfo, b as AdLoadedInfo } from '../types-Vj55FghO.cjs';
1
+ import { C as ClientInfo, A as AdDetectInfo, P as PlayerAnalyticsContext, a as AdImpressionInfo, b as AdLoadedInfo } from '../types-XKUJJhlG.cjs';
2
2
 
3
3
  declare function getClientInfo(): ClientInfo;
4
4
  declare function getBrowserID(clientInfo: ClientInfo): Promise<string>;
5
- declare function sendInitialTracking(licenseKey?: string): Promise<void>;
6
- declare function sendHeartbeat(licenseKey?: string): Promise<void>;
7
- declare function sendAdDetectTracking(licenseKey: string | undefined, payload: Omit<AdDetectInfo, "source" | "timestamp"> & Partial<Pick<AdDetectInfo, "source" | "timestamp">>): Promise<void>;
8
- declare function sendAdLoadedTracking(licenseKey: string | undefined, payload: Omit<AdLoadedInfo, "timestamp" | "source"> & {
9
- source?: AdTrackingSource | string;
10
- }, adPlayerType?: "ima" | "hls"): Promise<void>;
11
- type AdImpressionTrackingPayload = {
12
- adIndex: number;
13
- source?: AdTrackingSource | string;
14
- durationSeconds?: number;
5
+ type PlayerMetricFlags = {
6
+ adLoaded?: boolean;
7
+ adDetect?: boolean;
8
+ captureAt?: string;
15
9
  };
16
- declare function sendAdImpressionTracking(licenseKey: string | undefined, payload: AdImpressionTrackingPayload, adPlayerType?: "ima" | "hls"): Promise<void>;
10
+ declare function sendInitialTracking(licenseKey?: string, context?: PlayerAnalyticsContext): Promise<void>;
11
+ declare function sendAdDetectTracking(licenseKey: string | undefined, adDetectInfo: AdDetectInfo, context?: PlayerAnalyticsContext): Promise<void>;
12
+ declare function sendAdLoadedTracking(licenseKey: string | undefined, adLoadedInfo: AdLoadedInfo, context?: PlayerAnalyticsContext): Promise<void>;
13
+ declare function sendAdImpressionTracking(licenseKey: string | undefined, adImpressionInfo: AdImpressionInfo, context?: PlayerAnalyticsContext): Promise<void>;
14
+ declare function sendHeartbeat(licenseKey?: string, context?: PlayerAnalyticsContext, flags?: PlayerMetricFlags): Promise<void>;
17
15
 
18
- export { type AdImpressionTrackingPayload, getBrowserID, getClientInfo, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking };
16
+ 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.3.59",
3
+ "version": "0.3.61",
4
4
  "main": "lib/index.js",
5
5
  "typings": "lib/index.d.ts",
6
6
  "scripts": {