stormcloud-video-player 0.1.13 → 0.2.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.
- package/README.md +418 -48
- package/dist/stormcloud-vp.min.js +1 -10
- package/lib/index.cjs +951 -28
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +3591 -2
- package/lib/index.d.ts +3591 -2
- package/lib/index.js +925 -18
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +1669 -0
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -0
- package/lib/player/StormcloudVideoPlayer.d.cts +74 -0
- package/lib/players/FilePlayer.cjs +233 -0
- package/lib/players/FilePlayer.cjs.map +1 -0
- package/lib/players/FilePlayer.d.cts +48 -0
- package/lib/players/HlsPlayer.cjs +1847 -0
- package/lib/players/HlsPlayer.cjs.map +1 -0
- package/lib/players/HlsPlayer.d.cts +37 -0
- package/lib/players/index.cjs +2055 -0
- package/lib/players/index.cjs.map +1 -0
- package/lib/players/index.d.cts +10 -0
- package/lib/sdk/ima.cjs +420 -0
- package/lib/sdk/ima.cjs.map +1 -0
- package/lib/sdk/ima.d.cts +10 -0
- package/lib/types-GpA_hKek.d.cts +67 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +2905 -0
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -0
- package/lib/ui/StormcloudVideoPlayer.d.cts +13 -0
- package/lib/utils/tracking.cjs +250 -0
- package/lib/utils/tracking.cjs.map +1 -0
- package/lib/utils/tracking.d.cts +8 -0
- package/package.json +12 -5
- package/rollup.config.js +62 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/utils/tracking.ts
|
|
21
|
+
var tracking_exports = {};
|
|
22
|
+
__export(tracking_exports, {
|
|
23
|
+
getBrowserID: () => getBrowserID,
|
|
24
|
+
getClientInfo: () => getClientInfo,
|
|
25
|
+
sendHeartbeat: () => sendHeartbeat,
|
|
26
|
+
sendInitialTracking: () => sendInitialTracking
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(tracking_exports);
|
|
29
|
+
function getClientInfo() {
|
|
30
|
+
const ua = navigator.userAgent;
|
|
31
|
+
const platform = navigator.platform;
|
|
32
|
+
const vendor = navigator.vendor || "";
|
|
33
|
+
const maxTouchPoints = navigator.maxTouchPoints || 0;
|
|
34
|
+
const memory = navigator.deviceMemory || null;
|
|
35
|
+
const hardwareConcurrency = navigator.hardwareConcurrency || 1;
|
|
36
|
+
const screenInfo = {
|
|
37
|
+
width: screen?.width,
|
|
38
|
+
height: screen?.height,
|
|
39
|
+
availWidth: screen?.availWidth,
|
|
40
|
+
availHeight: screen?.availHeight,
|
|
41
|
+
orientation: screen?.orientation?.type || "",
|
|
42
|
+
pixelDepth: screen?.pixelDepth
|
|
43
|
+
};
|
|
44
|
+
let deviceType = "desktop";
|
|
45
|
+
let brand = "Unknown";
|
|
46
|
+
let os = "Unknown";
|
|
47
|
+
let model = "";
|
|
48
|
+
let isSmartTV = false;
|
|
49
|
+
let isAndroid = false;
|
|
50
|
+
let isWebView = false;
|
|
51
|
+
let isWebApp = false;
|
|
52
|
+
if (ua.includes("Web0S")) {
|
|
53
|
+
brand = "LG";
|
|
54
|
+
os = "webOS";
|
|
55
|
+
isSmartTV = true;
|
|
56
|
+
deviceType = "tv";
|
|
57
|
+
const webosMatch = ua.match(/Web0S\/([^\s]+)/);
|
|
58
|
+
model = webosMatch ? `webOS ${webosMatch[1]}` : "webOS TV";
|
|
59
|
+
} else if (ua.includes("Tizen")) {
|
|
60
|
+
brand = "Samsung";
|
|
61
|
+
os = "Tizen";
|
|
62
|
+
isSmartTV = true;
|
|
63
|
+
deviceType = "tv";
|
|
64
|
+
const tizenMatch = ua.match(/Tizen\/([^\s]+)/);
|
|
65
|
+
const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? "Smart TV" : "";
|
|
66
|
+
model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : "Tizen TV";
|
|
67
|
+
} else if (ua.includes("Philips")) {
|
|
68
|
+
brand = "Philips";
|
|
69
|
+
os = "Saphi";
|
|
70
|
+
isSmartTV = true;
|
|
71
|
+
deviceType = "tv";
|
|
72
|
+
} else if (ua.includes("Sharp") || ua.includes("AQUOS")) {
|
|
73
|
+
brand = "Sharp";
|
|
74
|
+
os = "Android TV";
|
|
75
|
+
isSmartTV = true;
|
|
76
|
+
deviceType = "tv";
|
|
77
|
+
} else if (ua.includes("Android") && (ua.includes("Sony") || vendor.includes("Sony"))) {
|
|
78
|
+
brand = "Sony";
|
|
79
|
+
os = "Android TV";
|
|
80
|
+
isSmartTV = true;
|
|
81
|
+
deviceType = "tv";
|
|
82
|
+
} else if (ua.includes("Android") && (ua.includes("NetCast") || ua.includes("LG"))) {
|
|
83
|
+
brand = "LG";
|
|
84
|
+
os = "Android TV";
|
|
85
|
+
isSmartTV = true;
|
|
86
|
+
deviceType = "tv";
|
|
87
|
+
} else if (ua.includes(" Roku") || ua.includes("Roku/")) {
|
|
88
|
+
brand = "Roku";
|
|
89
|
+
os = "Roku OS";
|
|
90
|
+
isSmartTV = true;
|
|
91
|
+
deviceType = "tv";
|
|
92
|
+
} else if (ua.includes("AppleTV")) {
|
|
93
|
+
brand = "Apple";
|
|
94
|
+
os = "tvOS";
|
|
95
|
+
isSmartTV = true;
|
|
96
|
+
deviceType = "tv";
|
|
97
|
+
}
|
|
98
|
+
if (ua.includes("Android")) {
|
|
99
|
+
isAndroid = true;
|
|
100
|
+
os = "Android";
|
|
101
|
+
deviceType = /Mobile/.test(ua) ? "mobile" : "tablet";
|
|
102
|
+
if (ua.includes("Android") && (maxTouchPoints === 0 || ua.includes("Google TV") || ua.includes("XiaoMi"))) {
|
|
103
|
+
deviceType = "tv";
|
|
104
|
+
isSmartTV = true;
|
|
105
|
+
brand = brand === "Unknown" ? "Android TV" : brand;
|
|
106
|
+
}
|
|
107
|
+
const androidModelMatch = ua.match(/\(([^)]*Android[^)]*)\)/);
|
|
108
|
+
if (androidModelMatch && androidModelMatch[1]) {
|
|
109
|
+
model = androidModelMatch[1];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (/iPad|iPhone|iPod/.test(ua)) {
|
|
113
|
+
os = "iOS";
|
|
114
|
+
deviceType = "mobile";
|
|
115
|
+
brand = "Apple";
|
|
116
|
+
if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {
|
|
117
|
+
deviceType = "tablet";
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {
|
|
121
|
+
if (ua.includes("Windows")) {
|
|
122
|
+
os = "Windows";
|
|
123
|
+
deviceType = "desktop";
|
|
124
|
+
} else if (ua.includes("Mac") && !/iPhone/.test(ua)) {
|
|
125
|
+
os = "macOS";
|
|
126
|
+
deviceType = "desktop";
|
|
127
|
+
if (maxTouchPoints > 1) deviceType = "tablet";
|
|
128
|
+
} else if (ua.includes("Linux")) {
|
|
129
|
+
os = "Linux";
|
|
130
|
+
deviceType = "desktop";
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (brand === "Unknown") {
|
|
134
|
+
if (vendor.includes("Google") || ua.includes("Chrome")) brand = "Google";
|
|
135
|
+
if (vendor.includes("Apple")) brand = "Apple";
|
|
136
|
+
if (vendor.includes("Samsung") || ua.includes("SM-")) brand = "Samsung";
|
|
137
|
+
}
|
|
138
|
+
isWebView = /wv|WebView|Linux; U;/.test(ua);
|
|
139
|
+
if (window?.outerHeight === 0 && window?.outerWidth === 0) {
|
|
140
|
+
isWebView = true;
|
|
141
|
+
}
|
|
142
|
+
isWebApp = window.matchMedia("(display-mode: standalone)").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;
|
|
143
|
+
return {
|
|
144
|
+
brand,
|
|
145
|
+
os,
|
|
146
|
+
model: model || ua.substring(0, 50) + "...",
|
|
147
|
+
deviceType,
|
|
148
|
+
isSmartTV,
|
|
149
|
+
isAndroid,
|
|
150
|
+
isWebView,
|
|
151
|
+
isWebApp,
|
|
152
|
+
domain: window.location.hostname,
|
|
153
|
+
origin: window.location.origin,
|
|
154
|
+
path: window.location.pathname,
|
|
155
|
+
userAgent: ua,
|
|
156
|
+
vendor,
|
|
157
|
+
platform,
|
|
158
|
+
screen: screenInfo,
|
|
159
|
+
hardwareConcurrency,
|
|
160
|
+
deviceMemory: memory,
|
|
161
|
+
maxTouchPoints,
|
|
162
|
+
language: navigator.language,
|
|
163
|
+
languages: navigator.languages?.join(",") || "",
|
|
164
|
+
cookieEnabled: navigator.cookieEnabled,
|
|
165
|
+
doNotTrack: navigator.doNotTrack || "",
|
|
166
|
+
referrer: document.referrer,
|
|
167
|
+
visibilityState: document.visibilityState
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
async function getBrowserID(clientInfo) {
|
|
171
|
+
const fingerprintString = JSON.stringify(clientInfo);
|
|
172
|
+
const hashBuffer = await crypto.subtle.digest(
|
|
173
|
+
"SHA-256",
|
|
174
|
+
new TextEncoder().encode(fingerprintString)
|
|
175
|
+
);
|
|
176
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
177
|
+
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
178
|
+
return hashHex;
|
|
179
|
+
}
|
|
180
|
+
async function sendInitialTracking(licenseKey) {
|
|
181
|
+
try {
|
|
182
|
+
const clientInfo = getClientInfo();
|
|
183
|
+
const browserId = await getBrowserID(clientInfo);
|
|
184
|
+
const trackingData = {
|
|
185
|
+
browserId,
|
|
186
|
+
...clientInfo
|
|
187
|
+
};
|
|
188
|
+
const headers = {
|
|
189
|
+
"Content-Type": "application/json"
|
|
190
|
+
};
|
|
191
|
+
if (licenseKey) {
|
|
192
|
+
headers["Authorization"] = `Bearer ${licenseKey}`;
|
|
193
|
+
}
|
|
194
|
+
const response = await fetch(
|
|
195
|
+
"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track",
|
|
196
|
+
{
|
|
197
|
+
method: "POST",
|
|
198
|
+
headers,
|
|
199
|
+
body: JSON.stringify(trackingData)
|
|
200
|
+
}
|
|
201
|
+
);
|
|
202
|
+
if (!response.ok) {
|
|
203
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
204
|
+
}
|
|
205
|
+
await response.json();
|
|
206
|
+
} catch (error) {
|
|
207
|
+
console.error(
|
|
208
|
+
"[StormcloudVideoPlayer] Error sending initial tracking data:",
|
|
209
|
+
error
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async function sendHeartbeat(licenseKey) {
|
|
214
|
+
try {
|
|
215
|
+
const clientInfo = getClientInfo();
|
|
216
|
+
const browserId = await getBrowserID(clientInfo);
|
|
217
|
+
const heartbeatData = {
|
|
218
|
+
browserId,
|
|
219
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
220
|
+
};
|
|
221
|
+
const headers = {
|
|
222
|
+
"Content-Type": "application/json"
|
|
223
|
+
};
|
|
224
|
+
if (licenseKey) {
|
|
225
|
+
headers["Authorization"] = `Bearer ${licenseKey}`;
|
|
226
|
+
}
|
|
227
|
+
const response = await fetch(
|
|
228
|
+
"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat",
|
|
229
|
+
{
|
|
230
|
+
method: "POST",
|
|
231
|
+
headers,
|
|
232
|
+
body: JSON.stringify(heartbeatData)
|
|
233
|
+
}
|
|
234
|
+
);
|
|
235
|
+
if (!response.ok) {
|
|
236
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
237
|
+
}
|
|
238
|
+
await response.json();
|
|
239
|
+
} catch (error) {
|
|
240
|
+
console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
244
|
+
0 && (module.exports = {
|
|
245
|
+
getBrowserID,
|
|
246
|
+
getClientInfo,
|
|
247
|
+
sendHeartbeat,
|
|
248
|
+
sendInitialTracking
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=tracking.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/tracking.ts"],"sourcesContent":["import type { ClientInfo, TrackingData, HeartbeatData } from \"../types\";\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 const fingerprintString = JSON.stringify(clientInfo);\n const hashBuffer = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(fingerprintString)\n );\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return hashHex;\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"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { C as ClientInfo } from '../types-GpA_hKek.cjs';
|
|
2
|
+
|
|
3
|
+
declare function getClientInfo(): ClientInfo;
|
|
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
|
+
|
|
8
|
+
export { getBrowserID, getClientInfo, sendHeartbeat, sendInitialTracking };
|
package/package.json
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stormcloud-video-player",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"main": "lib/index.
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"main": "lib/index.js",
|
|
5
|
+
"typings": "lib/index.d.ts",
|
|
5
6
|
"scripts": {
|
|
7
|
+
"clean": "rimraf lib dist *.d.ts",
|
|
6
8
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
7
9
|
"build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --out-dir lib",
|
|
10
|
+
"build:lib": "tsup src/**/*.ts src/**/*.tsx --format cjs --dts --sourcemap --out-dir lib",
|
|
8
11
|
"build:minified": "rollup -c rollup.config.js",
|
|
9
|
-
"build:
|
|
12
|
+
"build:dist": "rollup -c rollup.config.js --environment BUILD:production",
|
|
13
|
+
"build:all": "npm run clean && npm run build && npm run build:lib && npm run build:minified && npm run build:dist",
|
|
10
14
|
"dev": "tsup src/index.ts --format esm,cjs --dts --watch --out-dir lib",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
15
|
+
"prepublishOnly": "npm run build:lib && npm run build:dist && node scripts/copy-exports.js",
|
|
16
|
+
"postpublish": "npm run clean"
|
|
13
17
|
},
|
|
14
18
|
"description": "Ad-first HLS video player with SCTE-35 support and Google IMA integration for precise ad break alignment",
|
|
15
19
|
"keywords": [
|
|
@@ -47,6 +51,7 @@
|
|
|
47
51
|
"@rollup/plugin-typescript": "^12.1.4",
|
|
48
52
|
"@types/react": "^18.3.4",
|
|
49
53
|
"@types/react-dom": "^18.3.0",
|
|
54
|
+
"rimraf": "^3.0.2",
|
|
50
55
|
"tslib": "^2.8.1",
|
|
51
56
|
"tsup": "^8.5.0",
|
|
52
57
|
"typescript": "^5.9.2"
|
|
@@ -70,6 +75,8 @@
|
|
|
70
75
|
"files": [
|
|
71
76
|
"lib/**/*",
|
|
72
77
|
"dist/**/*",
|
|
78
|
+
"*.js",
|
|
79
|
+
"*.d.ts",
|
|
73
80
|
"README.md",
|
|
74
81
|
"LICENSE"
|
|
75
82
|
],
|
package/rollup.config.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import resolve from "@rollup/plugin-node-resolve";
|
|
2
|
+
import commonjs from "@rollup/plugin-commonjs";
|
|
3
|
+
import terser from "@rollup/plugin-terser";
|
|
4
|
+
import typescript from "@rollup/plugin-typescript";
|
|
5
|
+
import replace from "@rollup/plugin-replace";
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
input: "src/index.ts",
|
|
9
|
+
|
|
10
|
+
output: {
|
|
11
|
+
file: "dist/stormcloud-vp.min.js",
|
|
12
|
+
format: "umd",
|
|
13
|
+
name: "StormcloudVP",
|
|
14
|
+
sourcemap: false,
|
|
15
|
+
globals: {},
|
|
16
|
+
exports: "named",
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
treeshake: false,
|
|
20
|
+
|
|
21
|
+
plugins: [
|
|
22
|
+
resolve({
|
|
23
|
+
browser: true,
|
|
24
|
+
preferBuiltins: false,
|
|
25
|
+
}),
|
|
26
|
+
commonjs({
|
|
27
|
+
include: ["node_modules/**"],
|
|
28
|
+
}),
|
|
29
|
+
typescript({
|
|
30
|
+
tsconfig: "./tsconfig.json",
|
|
31
|
+
sourceMap: false,
|
|
32
|
+
inlineSources: false,
|
|
33
|
+
declaration: false,
|
|
34
|
+
declarationMap: false,
|
|
35
|
+
}),
|
|
36
|
+
replace({
|
|
37
|
+
preventAssignment: true,
|
|
38
|
+
values: {
|
|
39
|
+
"process.env.NODE_ENV": JSON.stringify("production"),
|
|
40
|
+
"process.env": JSON.stringify({}),
|
|
41
|
+
},
|
|
42
|
+
}),
|
|
43
|
+
terser({
|
|
44
|
+
compress: {
|
|
45
|
+
drop_console: false,
|
|
46
|
+
drop_debugger: true,
|
|
47
|
+
pure_funcs: ["console.debug"],
|
|
48
|
+
},
|
|
49
|
+
mangle: {
|
|
50
|
+
reserved: ["StormcloudVP"],
|
|
51
|
+
},
|
|
52
|
+
}),
|
|
53
|
+
],
|
|
54
|
+
|
|
55
|
+
external: [],
|
|
56
|
+
|
|
57
|
+
onwarn(warning, warn) {
|
|
58
|
+
if (warning.code === "CIRCULAR_DEPENDENCY") return;
|
|
59
|
+
if (warning.code === "THIS_IS_UNDEFINED") return;
|
|
60
|
+
warn(warning);
|
|
61
|
+
},
|
|
62
|
+
};
|