stormcloud-video-player 0.3.16 → 0.4.0

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 (38) hide show
  1. package/README.md +158 -112
  2. package/dist/stormcloud-vp.min.js +1 -10
  3. package/lib/index.cjs +3805 -6041
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +19 -102
  6. package/lib/index.d.ts +19 -102
  7. package/lib/index.js +3814 -6042
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/StormcloudVideoPlayer.cjs +1497 -4885
  10. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  11. package/lib/player/StormcloudVideoPlayer.d.cts +9 -78
  12. package/lib/players/FilePlayer.cjs.map +1 -1
  13. package/lib/players/HlsPlayer.cjs +1497 -4885
  14. package/lib/players/HlsPlayer.cjs.map +1 -1
  15. package/lib/players/HlsPlayer.d.cts +1 -1
  16. package/lib/players/index.cjs +1499 -4887
  17. package/lib/players/index.cjs.map +1 -1
  18. package/lib/sdk/adstormPlayer.cjs +908 -0
  19. package/lib/sdk/adstormPlayer.cjs.map +1 -0
  20. package/lib/sdk/adstormPlayer.d.cts +9 -0
  21. package/lib/sdk/hlsAdPlayer.cjs +84 -74
  22. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  23. package/lib/sdk/hlsAdPlayer.d.cts +2 -2
  24. package/lib/{types-CryTJVCC.d.cts → types-Ca4ZDaWw.d.cts} +3 -8
  25. package/lib/ui/StormcloudVideoPlayer.cjs +1499 -4895
  26. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  27. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  28. package/lib/utils/browserCompat.cjs +1 -52
  29. package/lib/utils/browserCompat.cjs.map +1 -1
  30. package/lib/utils/browserCompat.d.cts +1 -6
  31. package/lib/utils/polyfills.cjs.map +1 -1
  32. package/lib/utils/tracking.cjs.map +1 -1
  33. package/lib/utils/tracking.d.cts +1 -1
  34. package/package.json +5 -1
  35. package/rollup.config.js +22 -0
  36. package/lib/sdk/ima.cjs +0 -1100
  37. package/lib/sdk/ima.cjs.map +0 -1
  38. 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-CryTJVCC.cjs';
3
+ import { S as StormcloudVideoPlayerConfig } from '../types-Ca4ZDaWw.cjs';
4
4
 
5
5
  type StormcloudVideoPlayerProps = Omit<StormcloudVideoPlayerConfig, "videoElement"> & React.VideoHTMLAttributes<HTMLVideoElement> & {
6
6
  onReady?: (player: StormcloudVideoPlayer) => void;
@@ -58,18 +58,12 @@ __export(browserCompat_exports, {
58
58
  getBrowserConfigOverrides: function() {
59
59
  return getBrowserConfigOverrides;
60
60
  },
61
- getRecommendedAdPlayer: function() {
62
- return getRecommendedAdPlayer;
63
- },
64
61
  logBrowserInfo: function() {
65
62
  return logBrowserInfo;
66
63
  },
67
64
  supportsFeature: function() {
68
65
  return supportsFeature;
69
66
  },
70
- supportsGoogleIMA: function() {
71
- return supportsGoogleIMA;
72
- },
73
67
  supportsModernJS: function() {
74
68
  return supportsModernJS;
75
69
  }
@@ -111,9 +105,7 @@ function detectBrowser() {
111
105
  var majorVersion = 0;
112
106
  var isSmartTV = false;
113
107
  var isLegacyTV = false;
114
- var supportsIMA = true;
115
108
  var supportsModernJS2 = true;
116
- var recommendedAdPlayer = "ima";
117
109
  if (/Web0S|webOS/i.test(ua)) {
118
110
  name = "LG WebOS";
119
111
  isSmartTV = true;
@@ -152,24 +144,18 @@ function detectBrowser() {
152
144
  majorVersion = chromeVersion;
153
145
  }
154
146
  if (chromeVersion < 50) {
155
- supportsIMA = false;
156
147
  supportsModernJS2 = false;
157
148
  isLegacyTV = true;
158
- recommendedAdPlayer = "hls";
159
149
  }
160
150
  }
161
151
  if (webkitVersion > 0 && webkitVersion < 600) {
162
152
  supportsModernJS2 = false;
163
153
  if (isSmartTV) {
164
154
  isLegacyTV = true;
165
- supportsIMA = false;
166
- recommendedAdPlayer = "hls";
167
155
  }
168
156
  }
169
157
  if (typeof Promise === "undefined" || typeof Map === "undefined" || typeof Set === "undefined") {
170
158
  supportsModernJS2 = false;
171
- supportsIMA = false;
172
- recommendedAdPlayer = "hls";
173
159
  }
174
160
  if (typeof URLSearchParams === "undefined") {
175
161
  supportsModernJS2 = false;
@@ -181,36 +167,9 @@ function detectBrowser() {
181
167
  isSmartTV: isSmartTV,
182
168
  isLegacyTV: isLegacyTV,
183
169
  platform: platform,
184
- supportsIMA: supportsIMA,
185
- supportsModernJS: supportsModernJS2,
186
- recommendedAdPlayer: recommendedAdPlayer
170
+ supportsModernJS: supportsModernJS2
187
171
  };
188
172
  }
189
- function supportsGoogleIMA() {
190
- var browser = detectBrowser();
191
- if (browser.isLegacyTV) {
192
- return false;
193
- }
194
- if (typeof document === "undefined" || typeof document.createElement !== "function") {
195
- return false;
196
- }
197
- try {
198
- var video = document.createElement("video");
199
- if (!video) {
200
- return false;
201
- }
202
- } catch (e) {
203
- return false;
204
- }
205
- if (typeof Promise === "undefined") {
206
- return false;
207
- }
208
- return browser.supportsIMA;
209
- }
210
- function getRecommendedAdPlayer() {
211
- var browser = detectBrowser();
212
- return browser.recommendedAdPlayer;
213
- }
214
173
  function supportsModernJS() {
215
174
  try {
216
175
  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";
@@ -222,24 +181,18 @@ function logBrowserInfo() {
222
181
  var debug = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : false;
223
182
  if (!debug) return;
224
183
  var browser = detectBrowser();
225
- var imaSupport = supportsGoogleIMA();
226
184
  console.log("[StormcloudVideoPlayer] Browser Compatibility Info:", {
227
185
  browser: "".concat(browser.name, " ").concat(browser.version),
228
186
  platform: browser.platform,
229
187
  isSmartTV: browser.isSmartTV,
230
188
  isLegacyTV: browser.isLegacyTV,
231
- supportsIMA: imaSupport,
232
189
  supportsModernJS: browser.supportsModernJS,
233
- recommendedAdPlayer: browser.recommendedAdPlayer,
234
190
  userAgent: navigator.userAgent
235
191
  });
236
192
  }
237
193
  function getBrowserConfigOverrides() {
238
194
  var browser = detectBrowser();
239
195
  var overrides = {};
240
- if (browser.isLegacyTV || !browser.supportsIMA) {
241
- overrides.adPlayerType = "hls";
242
- }
243
196
  if (browser.isSmartTV) {
244
197
  overrides.allowNativeHls = true;
245
198
  }
@@ -247,8 +200,6 @@ function getBrowserConfigOverrides() {
247
200
  }
248
201
  function supportsFeature(feature) {
249
202
  switch(feature){
250
- case "ima":
251
- return supportsGoogleIMA();
252
203
  case "urlsearchparams":
253
204
  return typeof URLSearchParams !== "undefined";
254
205
  case "textencoder":
@@ -267,10 +218,8 @@ function supportsFeature(feature) {
267
218
  0 && (module.exports = {
268
219
  detectBrowser: detectBrowser,
269
220
  getBrowserConfigOverrides: getBrowserConfigOverrides,
270
- getRecommendedAdPlayer: getRecommendedAdPlayer,
271
221
  logBrowserInfo: logBrowserInfo,
272
222
  supportsFeature: supportsFeature,
273
- supportsGoogleIMA: supportsGoogleIMA,
274
223
  supportsModernJS: supportsModernJS
275
224
  });
276
225
  //# sourceMappingURL=browserCompat.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/utils/browserCompat.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","__getOwnPropNames","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call"],"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 if (/Web0S|webOS/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\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 }\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 }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n }\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS2 = false;\n isLegacyTV = true;\n recommendedAdPlayer = \"hls\";\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS2 = false;\n if (isSmartTV) {\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\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 };\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 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"]}
1
+ {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/utils/browserCompat.cjs","../../src/utils/browserCompat.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","__getOwnPropNames","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","browserCompat_exports","detectBrowser","getBrowserConfigOverrides","logBrowserInfo","supportsFeature","supportsModernJS","module","exports","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","version","majorVersion","isSmartTV","isLegacyTV","parts","split","chromeVersion","webkitVersion","toString","Promise","Map","Set","URLSearchParams","Array","assign","forEach","String","includes","e"],"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 logBrowserInfo: () => logBrowserInfo,\n supportsFeature: () => supportsFeature,\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 supportsModernJS2 = true;\n if (/Web0S|webOS/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\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 }\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 }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n }\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n if (chromeVersion < 50) {\n supportsModernJS2 = false;\n isLegacyTV = true;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS2 = false;\n if (isSmartTV) {\n isLegacyTV = true;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS2 = false;\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 supportsModernJS: supportsModernJS2\n };\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 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 supportsModernJS: browser.supportsModernJS,\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 \"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 logBrowserInfo,\n supportsFeature,\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 supportsModernJS: boolean;\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 supportsModernJS = true;\n\n if (/Web0S|webOS/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\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 }\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 }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n }\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n\n if (chromeVersion < 50) {\n supportsModernJS = false;\n isLegacyTV = true;\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (isSmartTV) {\n isLegacyTV = true;\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\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 supportsModernJS,\n };\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\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 supportsModernJS: browser.supportsModernJS,\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 '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"]}
@@ -18,19 +18,14 @@ interface BrowserInfo {
18
18
  isSmartTV: boolean;
19
19
  isLegacyTV: boolean;
20
20
  platform: string;
21
- supportsIMA: boolean;
22
21
  supportsModernJS: boolean;
23
- recommendedAdPlayer: 'ima' | 'hls';
24
22
  }
25
23
  declare function detectBrowser(): BrowserInfo;
26
- declare function supportsGoogleIMA(): boolean;
27
- declare function getRecommendedAdPlayer(): 'ima' | 'hls';
28
24
  declare function supportsModernJS(): boolean;
29
25
  declare function logBrowserInfo(debug?: boolean): void;
30
26
  declare function getBrowserConfigOverrides(): {
31
- adPlayerType?: 'ima' | 'hls';
32
27
  allowNativeHls?: boolean;
33
28
  };
34
29
  declare function supportsFeature(feature: string): boolean;
35
30
 
36
- export { type BrowserInfo, detectBrowser, getBrowserConfigOverrides, getRecommendedAdPlayer, logBrowserInfo, supportsFeature, supportsGoogleIMA, supportsModernJS };
31
+ export { type BrowserInfo, detectBrowser, getBrowserConfigOverrides, logBrowserInfo, supportsFeature, supportsModernJS };
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/utils/polyfills.cjs"],"names":[],"mappings":"AAAA","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/polyfills.ts\nvar polyfills_exports = {};\n__export(polyfills_exports, {\n initializePolyfills: () => initializePolyfills,\n polyfillArrayFrom: () => polyfillArrayFrom,\n polyfillObjectAssign: () => polyfillObjectAssign,\n polyfillPromiseFinally: () => polyfillPromiseFinally,\n polyfillStringEndsWith: () => polyfillStringEndsWith,\n polyfillStringIncludes: () => polyfillStringIncludes,\n polyfillStringStartsWith: () => polyfillStringStartsWith,\n polyfillTextEncoder: () => polyfillTextEncoder,\n polyfillURLSearchParams: () => polyfillURLSearchParams\n});\nmodule.exports = __toCommonJS(polyfills_exports);\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n initializePolyfills,\n polyfillArrayFrom,\n polyfillObjectAssign,\n polyfillPromiseFinally,\n polyfillStringEndsWith,\n polyfillStringIncludes,\n polyfillStringStartsWith,\n polyfillTextEncoder,\n polyfillURLSearchParams\n});\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/utils/polyfills.cjs","../../src/utils/polyfills.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","polyfills_exports","initializePolyfills","polyfillArrayFrom","polyfillObjectAssign","polyfillPromiseFinally","polyfillStringEndsWith","polyfillStringIncludes","polyfillStringStartsWith","polyfillTextEncoder","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","params","Map","parseQueryString","forEach","append","query","cleanQuery","startsWith","slice","split","param","decodedKey","safeDecodeURIComponent","decodedValue","str","decodeURIComponent","replace","e","values","push","String","set","delete","length","getAll","has","callback"],"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/polyfills.ts\nvar polyfills_exports = {};\n__export(polyfills_exports, {\n initializePolyfills: () => initializePolyfills,\n polyfillArrayFrom: () => polyfillArrayFrom,\n polyfillObjectAssign: () => polyfillObjectAssign,\n polyfillPromiseFinally: () => polyfillPromiseFinally,\n polyfillStringEndsWith: () => polyfillStringEndsWith,\n polyfillStringIncludes: () => polyfillStringIncludes,\n polyfillStringStartsWith: () => polyfillStringStartsWith,\n polyfillTextEncoder: () => polyfillTextEncoder,\n polyfillURLSearchParams: () => polyfillURLSearchParams\n});\nmodule.exports = __toCommonJS(polyfills_exports);\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n initializePolyfills,\n polyfillArrayFrom,\n polyfillObjectAssign,\n polyfillPromiseFinally,\n polyfillStringEndsWith,\n polyfillStringIncludes,\n polyfillStringStartsWith,\n polyfillTextEncoder,\n polyfillURLSearchParams\n});\n","export function polyfillURLSearchParams(): void {\n if (typeof URLSearchParams !== 'undefined') {\n return;\n }\n\n class URLSearchParamsPolyfill {\n private params: Map<string, string[]>;\n\n constructor(init?: string | URLSearchParamsPolyfill) {\n this.params = new Map();\n\n if (typeof init === 'string') {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n\n private parseQueryString(query: string): void {\n const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n if (!cleanQuery) return;\n\n cleanQuery.split('&').forEach((param) => {\n const [key, value] = param.split('=');\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n this.append(decodedKey, decodedValue);\n }\n });\n }\n\n private safeDecodeURIComponent(str: string): string {\n try {\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n } catch (e) {\n return str;\n }\n }\n\n append(name: string, value: string): void {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n\n delete(name: string): void {\n this.params.delete(name);\n }\n\n get(name: string): string | null {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n }\n\n getAll(name: string): string[] {\n return this.params.get(name) || [];\n }\n\n has(name: string): boolean {\n return this.params.has(name);\n }\n\n set(name: string, value: string): void {\n this.params.set(name, [String(value)]);\n }\n\n forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n\n toString(): string {\n const parts: string[] = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join('&');\n }\n }\n\n // @ts-ignore\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n if (typeof TextEncoder !== 'undefined') {\n return;\n }\n\n class TextEncoderPolyfill {\n encoding = 'utf-8';\n\n encode(str: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 0x80) {\n utf8.push(charcode);\n } else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n } else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(\n 0xe0 | (charcode >> 12),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n } else {\n i++;\n charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charcode >> 18),\n 0x80 | ((charcode >> 12) & 0x3f),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n\n // @ts-ignore\n window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n Promise.prototype.finally = function (callback: () => void) {\n const constructor = this.constructor as PromiseConstructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) =>\n constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\n\nexport function polyfillObjectAssign(): void {\n if (typeof Object.assign !== 'function') {\n Object.assign = function (target: any, ...sources: any[]) {\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n const to = Object(target);\n\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n\n return to;\n };\n }\n}\n\nexport function polyfillArrayFrom(): void {\n if (!Array.from) {\n Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError('Array.from requires an array-like object');\n }\n\n const len = items.length >>> 0;\n const result = new Array(len);\n\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n\n return result;\n };\n }\n}\n\nexport function polyfillStringStartsWith(): void {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function (search: string, pos?: number) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\n\nexport function polyfillStringEndsWith(): void {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function (search: string, length?: number) {\n if (length === undefined || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\n\nexport function polyfillStringIncludes(): void {\n if (!String.prototype.includes) {\n String.prototype.includes = function (search: string, start?: number) {\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\n\nexport function initializePolyfills(): void {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/utils/tracking.cjs"],"names":[],"mappings":"AAAA","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/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"]}
1
+ {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/utils/tracking.cjs","../../src/utils/tracking.ts"],"names":["__copyProps","__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","to","from","except","desc","key","call","__toCommonJS","tracking_exports","getBrowserID","sendHeartbeat","mod","value","getClientInfo","sendInitialTracking","exports","cachedBrowserId","platform","width","screen","isAndroid","window","navigator","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","height","availWidth","availHeight","orientation","type","pixelDepth","brand","os","model","isSmartTV","isWebView","isWebApp","ua","includes","deviceType","webosMatch","tizenMatch","match","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,4 +1,4 @@
1
- import { C as ClientInfo } from '../types-CryTJVCC.cjs';
1
+ import { C as ClientInfo } from '../types-Ca4ZDaWw.cjs';
2
2
 
3
3
  declare function getClientInfo(): ClientInfo;
4
4
  declare function getBrowserID(clientInfo: ClientInfo): Promise<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stormcloud-video-player",
3
- "version": "0.3.16",
3
+ "version": "0.4.0",
4
4
  "main": "lib/index.js",
5
5
  "typings": "lib/index.d.ts",
6
6
  "scripts": {
@@ -44,6 +44,9 @@
44
44
  "react-icons": "^5.5.0"
45
45
  },
46
46
  "devDependencies": {
47
+ "@babel/core": "^7.28.5",
48
+ "@babel/preset-env": "^7.28.5",
49
+ "@rollup/plugin-babel": "^6.1.0",
47
50
  "@rollup/plugin-commonjs": "^28.0.6",
48
51
  "@rollup/plugin-node-resolve": "^16.0.1",
49
52
  "@rollup/plugin-replace": "^6.0.2",
@@ -53,6 +56,7 @@
53
56
  "@types/react": "^18.3.4",
54
57
  "@types/react-dom": "^18.3.0",
55
58
  "rimraf": "^3.0.2",
59
+ "rollup-plugin-swc3": "^0.12.1",
56
60
  "tslib": "^2.8.1",
57
61
  "tsup": "^8.5.0",
58
62
  "typescript": "^5.9.2"
package/rollup.config.js CHANGED
@@ -3,6 +3,7 @@ import commonjs from "@rollup/plugin-commonjs";
3
3
  import terser from "@rollup/plugin-terser";
4
4
  import typescript from "@rollup/plugin-typescript";
5
5
  import replace from "@rollup/plugin-replace";
6
+ import babel from "@rollup/plugin-babel";
6
7
 
7
8
  export default {
8
9
  input: "src/index.ts",
@@ -33,6 +34,22 @@ export default {
33
34
  declaration: false,
34
35
  declarationMap: false,
35
36
  }),
37
+ babel({
38
+ babelHelpers: "bundled",
39
+ exclude: /node_modules\/core-js/,
40
+ extensions: [".js", ".jsx", ".ts", ".tsx", ".mjs"],
41
+ presets: [
42
+ [
43
+ "@babel/preset-env",
44
+ {
45
+ targets: {
46
+ chrome: "38",
47
+ },
48
+ modules: false,
49
+ },
50
+ ],
51
+ ],
52
+ }),
36
53
  replace({
37
54
  preventAssignment: true,
38
55
  values: {
@@ -41,14 +58,19 @@ export default {
41
58
  },
42
59
  }),
43
60
  terser({
61
+ ecma: 5,
44
62
  compress: {
45
63
  drop_console: false,
46
64
  drop_debugger: true,
47
65
  pure_funcs: ["console.debug"],
66
+ ecma: 5,
48
67
  },
49
68
  mangle: {
50
69
  reserved: ["StormcloudVP"],
51
70
  },
71
+ output: {
72
+ ecma: 5,
73
+ },
52
74
  }),
53
75
  ],
54
76