stormcloud-video-player 0.7.49 → 0.8.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 (50) hide show
  1. package/README.md +269 -228
  2. package/dist/stormcloud-vp.min.js +1 -1
  3. package/lib/index.cjs +5197 -6741
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +196 -195
  6. package/lib/index.d.ts +196 -195
  7. package/lib/index.js +5326 -6862
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/StormcloudVideoPlayer.cjs +4802 -3170
  10. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  11. package/lib/player/StormcloudVideoPlayer.d.cts +113 -70
  12. package/lib/players/FilePlayer.cjs.map +1 -1
  13. package/lib/players/HlsPlayer.cjs +4810 -3179
  14. package/lib/players/HlsPlayer.cjs.map +1 -1
  15. package/lib/players/HlsPlayer.d.cts +1 -1
  16. package/lib/players/index.cjs +4877 -3246
  17. package/lib/players/index.cjs.map +1 -1
  18. package/lib/sdk/hlsAdPlayer.cjs +1021 -0
  19. package/lib/sdk/hlsAdPlayer.cjs.map +1 -0
  20. package/lib/sdk/hlsAdPlayer.d.cts +10 -0
  21. package/lib/sdk/pal.cjs +358 -0
  22. package/lib/sdk/pal.cjs.map +1 -0
  23. package/lib/sdk/pal.d.cts +28 -0
  24. package/lib/{types-CIHDHY7A.d.cts → types-DDwAfBLt.d.cts} +11 -10
  25. package/lib/ui/StormcloudVideoPlayer.cjs +5070 -6603
  26. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  27. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -14
  28. package/lib/utils/browserCompat.cjs +10 -114
  29. package/lib/utils/browserCompat.cjs.map +1 -1
  30. package/lib/utils/browserCompat.d.cts +3 -7
  31. package/lib/utils/polyfills.cjs.map +1 -1
  32. package/lib/utils/tracking.cjs +179 -150
  33. package/lib/utils/tracking.cjs.map +1 -1
  34. package/lib/utils/tracking.d.cts +11 -6
  35. package/package.json +1 -2
  36. package/lib/sdk/adstormPlayer.cjs +0 -1567
  37. package/lib/sdk/adstormPlayer.cjs.map +0 -1
  38. package/lib/sdk/adstormPlayer.d.cts +0 -23
  39. package/lib/sdk/vastParser.cjs +0 -517
  40. package/lib/sdk/vastParser.cjs.map +0 -1
  41. package/lib/sdk/vastParser.d.cts +0 -45
  42. package/lib/ui/OverlayRenderer.cjs +0 -2370
  43. package/lib/ui/OverlayRenderer.cjs.map +0 -1
  44. package/lib/ui/OverlayRenderer.d.cts +0 -17
  45. package/lib/utils/adcision.cjs +0 -282
  46. package/lib/utils/adcision.cjs.map +0 -1
  47. package/lib/utils/adcision.d.cts +0 -31
  48. package/lib/utils/overlays.cjs +0 -354
  49. package/lib/utils/overlays.cjs.map +0 -1
  50. package/lib/utils/overlays.d.cts +0 -70
@@ -1,517 +0,0 @@
1
- "use strict";
2
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
3
- try {
4
- var info = gen[key](arg);
5
- var value = info.value;
6
- } catch (error) {
7
- reject(error);
8
- return;
9
- }
10
- if (info.done) {
11
- resolve(value);
12
- } else {
13
- Promise.resolve(value).then(_next, _throw);
14
- }
15
- }
16
- function _async_to_generator(fn) {
17
- return function() {
18
- var self = this, args = arguments;
19
- return new Promise(function(resolve, reject) {
20
- var gen = fn.apply(self, args);
21
- function _next(value) {
22
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
23
- }
24
- function _throw(err) {
25
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
26
- }
27
- _next(undefined);
28
- });
29
- };
30
- }
31
- function _type_of(obj) {
32
- "@swc/helpers - typeof";
33
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
34
- }
35
- function _ts_generator(thisArg, body) {
36
- var f, y, t, _ = {
37
- label: 0,
38
- sent: function() {
39
- if (t[0] & 1) throw t[1];
40
- return t[1];
41
- },
42
- trys: [],
43
- ops: []
44
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
45
- return d(g, "next", {
46
- value: verb(0)
47
- }), d(g, "throw", {
48
- value: verb(1)
49
- }), d(g, "return", {
50
- value: verb(2)
51
- }), typeof Symbol === "function" && d(g, Symbol.iterator, {
52
- value: function() {
53
- return this;
54
- }
55
- }), g;
56
- function verb(n) {
57
- return function(v) {
58
- return step([
59
- n,
60
- v
61
- ]);
62
- };
63
- }
64
- function step(op) {
65
- if (f) throw new TypeError("Generator is already executing.");
66
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
67
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
68
- if (y = 0, t) op = [
69
- op[0] & 2,
70
- t.value
71
- ];
72
- switch(op[0]){
73
- case 0:
74
- case 1:
75
- t = op;
76
- break;
77
- case 4:
78
- _.label++;
79
- return {
80
- value: op[1],
81
- done: false
82
- };
83
- case 5:
84
- _.label++;
85
- y = op[1];
86
- op = [
87
- 0
88
- ];
89
- continue;
90
- case 7:
91
- op = _.ops.pop();
92
- _.trys.pop();
93
- continue;
94
- default:
95
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
96
- _ = 0;
97
- continue;
98
- }
99
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
100
- _.label = op[1];
101
- break;
102
- }
103
- if (op[0] === 6 && _.label < t[1]) {
104
- _.label = t[1];
105
- t = op;
106
- break;
107
- }
108
- if (t && _.label < t[2]) {
109
- _.label = t[2];
110
- _.ops.push(op);
111
- break;
112
- }
113
- if (t[2]) _.ops.pop();
114
- _.trys.pop();
115
- continue;
116
- }
117
- op = body.call(thisArg, _);
118
- } catch (e) {
119
- op = [
120
- 6,
121
- e
122
- ];
123
- y = 0;
124
- } finally{
125
- f = t = 0;
126
- }
127
- if (op[0] & 5) throw op[1];
128
- return {
129
- value: op[0] ? op[1] : void 0,
130
- done: true
131
- };
132
- }
133
- }
134
- function _ts_values(o) {
135
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
136
- if (m) return m.call(o);
137
- if (o && typeof o.length === "number") return {
138
- next: function() {
139
- if (o && i >= o.length) o = void 0;
140
- return {
141
- value: o && o[i++],
142
- done: !o
143
- };
144
- }
145
- };
146
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
147
- }
148
- var __defProp = Object.defineProperty;
149
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
150
- var __getOwnPropNames = Object.getOwnPropertyNames;
151
- var __hasOwnProp = Object.prototype.hasOwnProperty;
152
- var __export = function __export(target, all) {
153
- for(var name in all)__defProp(target, name, {
154
- get: all[name],
155
- enumerable: true
156
- });
157
- };
158
- var __copyProps = function __copyProps(to, from, except, desc) {
159
- if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
160
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
161
- try {
162
- var _loop = function() {
163
- var key = _step.value;
164
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
165
- get: function get() {
166
- return from[key];
167
- },
168
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
169
- });
170
- };
171
- for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
172
- } catch (err) {
173
- _didIteratorError = true;
174
- _iteratorError = err;
175
- } finally{
176
- try {
177
- if (!_iteratorNormalCompletion && _iterator.return != null) {
178
- _iterator.return();
179
- }
180
- } finally{
181
- if (_didIteratorError) {
182
- throw _iteratorError;
183
- }
184
- }
185
- }
186
- }
187
- return to;
188
- };
189
- var __toCommonJS = function __toCommonJS(mod) {
190
- return __copyProps(__defProp({}, "__esModule", {
191
- value: true
192
- }), mod);
193
- };
194
- // src/sdk/vastParser.ts
195
- var vastParser_exports = {};
196
- __export(vastParser_exports, {
197
- createEmptyTrackingState: function createEmptyTrackingState1() {
198
- return createEmptyTrackingState;
199
- },
200
- fetchAndParseVastAd: function fetchAndParseVastAd1() {
201
- return fetchAndParseVastAd;
202
- },
203
- fireTrackingPixels: function fireTrackingPixels1() {
204
- return fireTrackingPixels;
205
- },
206
- parseVastXml: function parseVastXml1() {
207
- return parseVastXml;
208
- }
209
- });
210
- module.exports = __toCommonJS(vastParser_exports);
211
- function isHlsType(type) {
212
- return type === "application/x-mpegURL" || type.includes("m3u8");
213
- }
214
- function isMp4Type(type) {
215
- return type === "video/mp4" || type.includes("mp4");
216
- }
217
- function parseVastXml(xmlString) {
218
- var filter = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "all", logPrefix = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "[VastParser]";
219
- try {
220
- var _xmlDoc_querySelector, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector2;
221
- var parser = new DOMParser();
222
- var xmlDoc = parser.parseFromString(xmlString, "text/xml");
223
- var parserError = xmlDoc.querySelector("parsererror");
224
- if (parserError) {
225
- console.error("".concat(logPrefix, " XML parsing error (malformed VAST XML):"), parserError.textContent);
226
- return null;
227
- }
228
- var adElement = xmlDoc.querySelector("Ad");
229
- if (!adElement) {
230
- console.warn("".concat(logPrefix, " No Ad element found in VAST XML"));
231
- return null;
232
- }
233
- var adId = adElement.getAttribute("id") || "unknown";
234
- var title = ((_xmlDoc_querySelector = xmlDoc.querySelector("AdTitle")) === null || _xmlDoc_querySelector === void 0 ? void 0 : _xmlDoc_querySelector.textContent) || "Ad";
235
- var isNoAdAvailable = adId === "empty" || title.toLowerCase().includes("no ad available") || title.toLowerCase() === "no ad available";
236
- var durationText = ((_xmlDoc_querySelector1 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector1 === void 0 ? void 0 : _xmlDoc_querySelector1.textContent) || "00:00:30";
237
- var durationParts = durationText.split(":");
238
- var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + Math.round(parseFloat(durationParts[2] || "0"));
239
- var mediaFileElements = xmlDoc.querySelectorAll("MediaFile");
240
- var mediaFiles = [];
241
- console.log("".concat(logPrefix, " Found ").concat(mediaFileElements.length, " MediaFile element(s) in VAST XML"));
242
- mediaFileElements.forEach(function(mf, index) {
243
- var _mf_textContent;
244
- var type = mf.getAttribute("type") || "";
245
- var url = ((_mf_textContent = mf.textContent) === null || _mf_textContent === void 0 ? void 0 : _mf_textContent.trim()) || "";
246
- var width = mf.getAttribute("width") || "";
247
- var height = mf.getAttribute("height") || "";
248
- console.log("".concat(logPrefix, " MediaFile ").concat(index, ': type="').concat(type, '", url="').concat(url.substring(0, 80), '...", width="').concat(width, '", height="').concat(height, '"'));
249
- if (!url) {
250
- console.warn("".concat(logPrefix, " MediaFile ").concat(index, " has empty URL"));
251
- return;
252
- }
253
- var isHls = isHlsType(type);
254
- var isMp4 = isMp4Type(type);
255
- var accepted = false;
256
- if (filter === "hls-only") {
257
- accepted = isHls;
258
- } else if (filter === "mp4-first") {
259
- accepted = isMp4 || isHls;
260
- } else {
261
- accepted = true;
262
- }
263
- if (!accepted) {
264
- console.log("".concat(logPrefix, " MediaFile ").concat(index, ' ignored (type="').concat(type, '" not accepted by filter "').concat(filter, '")'));
265
- return;
266
- }
267
- var bitrateAttr = mf.getAttribute("bitrate");
268
- var bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;
269
- mediaFiles.push({
270
- url: url,
271
- type: type,
272
- width: parseInt(width || "1920", 10),
273
- height: parseInt(height || "1080", 10),
274
- bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0
275
- });
276
- console.log("".concat(logPrefix, ' Added MediaFile: type="').concat(type, '" url="').concat(url.substring(0, 80), '..."'));
277
- });
278
- if (filter === "mp4-first" && mediaFiles.length > 1) {
279
- mediaFiles.sort(function(a, b) {
280
- var aIsMp4 = isMp4Type(a.type) ? 0 : 1;
281
- var bIsMp4 = isMp4Type(b.type) ? 0 : 1;
282
- return aIsMp4 - bIsMp4;
283
- });
284
- }
285
- if (mediaFiles.length === 0) {
286
- if (isNoAdAvailable) {
287
- console.warn("".concat(logPrefix, " No ads available (VAST response indicates no ads)"));
288
- } else {
289
- console.warn("".concat(logPrefix, " No compatible media files found in VAST XML"));
290
- }
291
- return null;
292
- }
293
- var trackingUrls = {
294
- impression: [],
295
- start: [],
296
- firstQuartile: [],
297
- midpoint: [],
298
- thirdQuartile: [],
299
- complete: [],
300
- mute: [],
301
- unmute: [],
302
- pause: [],
303
- resume: [],
304
- fullscreen: [],
305
- exitFullscreen: [],
306
- skip: [],
307
- error: []
308
- };
309
- xmlDoc.querySelectorAll("Impression").forEach(function(el) {
310
- var _el_textContent;
311
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
312
- if (url) trackingUrls.impression.push(url);
313
- });
314
- xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
315
- var _el_textContent;
316
- var event = el.getAttribute("event");
317
- var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
318
- if (event && url) {
319
- var eventKey = event;
320
- if (trackingUrls[eventKey]) {
321
- trackingUrls[eventKey].push(url);
322
- }
323
- }
324
- });
325
- var clickThrough = (_xmlDoc_querySelector2 = xmlDoc.querySelector("ClickThrough")) === null || _xmlDoc_querySelector2 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent = _xmlDoc_querySelector2.textContent) === null || _xmlDoc_querySelector_textContent === void 0 ? void 0 : _xmlDoc_querySelector_textContent.trim();
326
- return {
327
- id: adId,
328
- title: title,
329
- duration: duration,
330
- mediaFiles: mediaFiles,
331
- trackingUrls: trackingUrls,
332
- clickThrough: clickThrough
333
- };
334
- } catch (error) {
335
- console.error("".concat(logPrefix, " Error parsing VAST XML:"), error);
336
- return null;
337
- }
338
- }
339
- function fetchAndParseVastAd(vastTagUrl) {
340
- var filter = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "all", logPrefix = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "[VastParser]";
341
- return _async_to_generator(function() {
342
- var response, vastXml;
343
- return _ts_generator(this, function(_state) {
344
- switch(_state.label){
345
- case 0:
346
- return [
347
- 4,
348
- fetch(vastTagUrl, {
349
- mode: "cors",
350
- credentials: "include",
351
- headers: {
352
- Accept: "application/xml, text/xml, */*"
353
- },
354
- referrerPolicy: "no-referrer-when-downgrade"
355
- })
356
- ];
357
- case 1:
358
- response = _state.sent();
359
- if (!response.ok) {
360
- throw new Error("Failed to fetch VAST: ".concat(response.statusText));
361
- }
362
- return [
363
- 4,
364
- response.text()
365
- ];
366
- case 2:
367
- vastXml = _state.sent();
368
- console.log("".concat(logPrefix, " VAST XML received"));
369
- console.log("".concat(logPrefix, " VAST XML content (first 2000 chars):"), vastXml.substring(0, 2e3));
370
- return [
371
- 2,
372
- parseVastXml(vastXml, filter, logPrefix)
373
- ];
374
- }
375
- });
376
- })();
377
- }
378
- function createEmptyTrackingState() {
379
- return {
380
- impression: false,
381
- start: false,
382
- firstQuartile: false,
383
- midpoint: false,
384
- thirdQuartile: false,
385
- complete: false
386
- };
387
- }
388
- function firePixelWithRetry(url) {
389
- var retries = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 2, delayMs = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : 500, logPrefix = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : "[VastParser]";
390
- return _async_to_generator(function() {
391
- var _loop, attempt, _ret;
392
- return _ts_generator(this, function(_state) {
393
- switch(_state.label){
394
- case 0:
395
- _loop = function(attempt) {
396
- var unused;
397
- return _ts_generator(this, function(_state) {
398
- switch(_state.label){
399
- case 0:
400
- _state.trys.push([
401
- 0,
402
- 2,
403
- ,
404
- 6
405
- ]);
406
- return [
407
- 4,
408
- fetch(url, {
409
- method: "GET",
410
- mode: "no-cors",
411
- cache: "no-cache",
412
- keepalive: true
413
- })
414
- ];
415
- case 1:
416
- _state.sent();
417
- return [
418
- 2,
419
- {
420
- v: void void 0
421
- }
422
- ];
423
- case 2:
424
- unused = _state.sent();
425
- if (!(attempt < retries)) return [
426
- 3,
427
- 4
428
- ];
429
- return [
430
- 4,
431
- new Promise(function(r) {
432
- return setTimeout(r, delayMs * Math.pow(2, attempt));
433
- })
434
- ];
435
- case 3:
436
- _state.sent();
437
- return [
438
- 3,
439
- 5
440
- ];
441
- case 4:
442
- console.warn("".concat(logPrefix, " Tracking pixel failed after ").concat(retries + 1, " attempts: ").concat(url));
443
- _state.label = 5;
444
- case 5:
445
- return [
446
- 3,
447
- 6
448
- ];
449
- case 6:
450
- return [
451
- 2
452
- ];
453
- }
454
- });
455
- };
456
- attempt = 0;
457
- _state.label = 1;
458
- case 1:
459
- if (!(attempt <= retries)) return [
460
- 3,
461
- 4
462
- ];
463
- return [
464
- 5,
465
- _ts_values(_loop(attempt))
466
- ];
467
- case 2:
468
- _ret = _state.sent();
469
- if (_type_of(_ret) === "object") return [
470
- 2,
471
- _ret.v
472
- ];
473
- _state.label = 3;
474
- case 3:
475
- attempt++;
476
- return [
477
- 3,
478
- 1
479
- ];
480
- case 4:
481
- return [
482
- 2
483
- ];
484
- }
485
- });
486
- })();
487
- }
488
- function fireTrackingPixels(urls, sessionId) {
489
- var logPrefix = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "[VastParser]";
490
- if (!urls || urls.length === 0) return;
491
- urls.forEach(function(url) {
492
- try {
493
- var trackingUrl = url;
494
- if (sessionId) {
495
- trackingUrl = "".concat(trackingUrl).concat(trackingUrl.includes("?") ? "&" : "?", "session_id=").concat(sessionId);
496
- }
497
- if (typeof fetch !== "undefined") {
498
- firePixelWithRetry(trackingUrl, 2, 500, logPrefix).catch(function() {});
499
- } else {
500
- var img = new Image(1, 1);
501
- img.onerror = function() {};
502
- img.src = trackingUrl;
503
- }
504
- console.log("".concat(logPrefix, " Fired tracking pixel: ").concat(trackingUrl));
505
- } catch (error) {
506
- console.warn("".concat(logPrefix, " Error firing tracking pixel:"), error);
507
- }
508
- });
509
- }
510
- // Annotate the CommonJS export names for ESM import in node:
511
- 0 && (module.exports = {
512
- createEmptyTrackingState: createEmptyTrackingState,
513
- fetchAndParseVastAd: fetchAndParseVastAd,
514
- fireTrackingPixels: fireTrackingPixels,
515
- parseVastXml: parseVastXml
516
- });
517
- //# sourceMappingURL=vastParser.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/vastParser.cjs","../../src/sdk/vastParser.ts"],"names":["Object","getOwnPropertyDescriptor","__defProp","defineProperty","__getOwnPropDesc","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","vastParser_exports","createEmptyTrackingState","fetchAndParseVastAd","fireTrackingPixels","parseVastXml","module","exports","isHlsType","type","includes","isMp4Type","xmlString","filter","logPrefix","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","console","error","textContent","adElement","warn","adId","getAttribute","title","isNoAdAvailable","toLowerCase","durationText","durationParts","split","duration","parseInt","Math","round","parseFloat","mediaFileElements","querySelectorAll","mediaFiles","log","length"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2DAEuBA,mCAAAA,KAAOC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAD1BC,YAAYF,OAAOG,cAAc;QACjCC,IAAAA,aAAmBJ,GAAAA,yBAAAA,OAAOC,aAAAA,CAAAA,QAAwB,qBAA/BD,8CAAAA,oCAAAA,uBAA+B,WAAA,cAA/BA,wDAAAA,kCAA+B,IAAA;QAClDK,OAAAA,aAAoBL,OAAOM,mBAAmB;YAC9CC,IAAAA,SAAeP,OAAOQ,SAAS,CAACC,cAAc;YAC9CC,OAAAA,SAAW,kBAACC,QAAQC;YACtB,UAAA,EAAK,IAAIC,QAAQD,IACfV,UAAUS,QAAQE,MAAM;0BAAEC,KAAKF,GAAG,CAACC,KAAK;4BAAEE,YAAY;YAAK,cAAA;QAC/D;IACA,EAAIC,OAAAA,OAAc,qBAACC,IAAIC,MAAMC,QAAQC;QACnC,IAAIF,IAAAA,IAAQ,CAAA,CAAA,GAAOA,OAAP,GAAOA,QAAAA,6BAAAA,GAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;gBAC7D,kCAAA,2BAAA;;;UAAA,IAAIG,MAAJ,SAAA,UAAA;QAAA,SAAA,iEAAA,OAAA,YAAA,iEAAA;;;;;;oBACH;;wBAAKd,MAAAA,GAAae,IAAI,CAACL,IAAII,QAAQA,QAAQF,QACzCjB,UAAUe,IAAII,KAAK;4CAAEP,KAAK,SAALA;uDAAWI,IAAI,CAACG,IAAI;;8CAAEN,YAAY,CAAEK,CAAAA,OAAOhB,iBAAiBc,MAAMG,IAAG,KAAMD,KAAKL,UAAU;wCAAC;;kCAFpH,QAAK,YAAWV,kBAAkBa,0BAA7B,SAAA,6BAAA,QAAA,yBAAA;;;4BACH,GAAA,CAAI,CAACX;;gCADF,EAAA,MAAA,yBAAA,OAAA,SAAA,UAAA;8BAAA;;;;;;;;uCAAA,iBAAA,YAAA;;;mCAAA,EAAA,SAAA,QAAA;;;;8BAAA;;;;;QAGP,OAAA;QACA,OAAOU,QAAAA;QACT,UAAA;QACIM,eAAe,sBAACC;eAAQR,GAAAA,SAAYd,UAAU,CAAC,GAAG,cAAc;UAAEuB,OAAO;IAAK,IAAID;;;;mBAEtF;;;;;;;;;;;;;;;oCCnBAd,GAAAgB;;wCAAAA,MAAAA,KAAAA,MAAA;4CAAAC,QAAAA,cAAA,SAAAA;mDAAAA;;4CAAAC,WAAAA,MAAA,SAAAA;iDAAAA;;;oCAAAlB;;;;;;;;;oDAAAmB,OAAAA,QAAAA;;;;;;;;;;;;;;;;;2CAAAC,CAAAA,IAAAA,CAAAA,GAAAA,OAAAA,WAAAA,iCAAAA,OAAAA,UAAAA,GAAAA,eAAAA,OAAAA;;;;;;;;;;;;;oBAAAC,KAAAC,OAAA,GAAAT,aAAAG;oBDmBA,UAAA;;;0BAAwB,WAAA,OAAA;;;;;;;;;;;;;;;;oBAAA;;;;;;;;;;;ICiBxB,SAASO,UAAUC,IAAA;;IACjB,KAAA,EAAOA,SAAS,QAAA,IAAA,EAAA,SAAA;QAAA,YAAA,EAA2BA,KAAKC,0DAAAA,GAAA,CAAS;IAC3D,IAAA,CAAA,QAAA,KAAA,MAAA,KAAA,GAAA;IAEA,KAAA,EAASC,KAAAA,CAAAA,SAAAA,GAAUF,IAAA;QACjB,IAAA,GAAOA,SAAS,eAAeA,KAAKC,QAAA,CAAS;YAC/C,IAAA,cAAA;YAEO,GAASL,CAAAA,WAAAA,CACdO,SAAA;gBACAC,SAAAA,KAAAA,GAAAA,OAAAA,aACAC,OADAD,YAAAA,QAAAA,CAAAA,OAAAA,MAAAA,KAAAA,KAA0B,OAC1BC,GAAAA,CAAAA,MAAAA,2DAAY;YAEZ,EAAI;kBAoBYC,KAAAA,UAAAA,QAQZA,KAAAA,mBAkHmBA,mCAAAA;gBA7IrB,IAAMC,SAAS,IAAIC,EAAAA,aAAAA,GAAAA,KAAAA,WAAAA,KAAAA,CAAAA,YACnB,IAAMF,SAASC,OAAOE,eAAA,CAAgBN,WAAW;cAEjD,IAAMO,CAAAA,aAAcJ,OAAOK,aAAA,CAAc;gBACzC,IAAID,MAAAA,IAAAA,CAAa,KAAA,GAAA;oBACfE,OAAAA,CAAQC,EAAAA,GAAA,CACN,GAAY,OAATR,EAGL,OAAO,EAHO,6CACZK,YAAYI,WAAA;gBAGhB,IAAA,GAAA,GAAA;cAEA,IAAMC,YAAYT,OAAOK,aAAA,CAAc;cACvC,IAAI,CAACI,CAAAA,GAAAA,CAAAA,GAAW,OAAXA,GAAW,QAAA,2BAAA,OAAA;gBACdH,CAAAA,OAAQI,IAAA,CAAK,GAAY,OAATX,WAAS;kBACzB,EAAA,IAAA,CAAO,GAAA,OAAA,WAAA,kCAAA;YACT;UAEA,IAAMY,OAAOF,UAAUG,YAAA,CAAa,SAAS;QAC7C,IAAMC,QAAQb,EAAAA,wBAAAA,OAAOK,aAAA,CAAc,wBAArBL,4CAAAA,sBAAiCQ,WAAA,KAAe;QAE9D,IAAMM,kBACJH,SAAS,WACTE,MAAME,KAAAA,MAAA,GAAcpB,QAAA,CAAS,sBAC7BkB,MAAME,WAAA,OAAkB;QAE1B,IAAMC,CAAAA,OAAAA,GAAAA,IACJhB,EAAAA,yBAAAA,OAAOK,aAAA,CAAc,yBAArBL,6CAAAA,uBAAkCQ,WAAA,KAAe;oCACnD,IAAMS,gBAAgBD,aAAaE,KAAA,CAAM;+BACzC,IAAMC,WACJC,SAASH,aAAA,CAAc,EAAC,IAAK,KAAK,MAAM,OACxCG,SAASH,aAAA,CAAc,EAAC,IAAK,KAAK,MAAM,KACxCI,KAAKC,KAAA,CAAMC,WAAWN,aAAA,CAAc,EAAC,IAAK;8BAE5C,IAAMO,oBAAoBxB,OAAOyB,gBAAA,CAAiB;wBAClD,IAAMC,aAA8B,EAAC;SAErCpB,QAAQqB,GAAA,CACN,GAAsBH,OAAnBzB,WAAS,WAAkC,OAAxByB,kBAAkBI,MAAM,EAAA","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/sdk/vastParser.ts\nvar vastParser_exports = {};\n__export(vastParser_exports, {\n createEmptyTrackingState: () => createEmptyTrackingState,\n fetchAndParseVastAd: () => fetchAndParseVastAd,\n fireTrackingPixels: () => fireTrackingPixels,\n parseVastXml: () => parseVastXml\n});\nmodule.exports = __toCommonJS(vastParser_exports);\nfunction isHlsType(type) {\n return type === \"application/x-mpegURL\" || type.includes(\"m3u8\");\n}\nfunction isMp4Type(type) {\n return type === \"video/mp4\" || type.includes(\"mp4\");\n}\nfunction parseVastXml(xmlString, filter = \"all\", logPrefix = \"[VastParser]\") {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n `${logPrefix} XML parsing error (malformed VAST XML):`,\n parserError.textContent\n );\n return null;\n }\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(`${logPrefix} No Ad element found in VAST XML`);\n return null;\n }\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n const durationText = xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + Math.round(parseFloat(durationParts[2] || \"0\"));\n const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n console.log(\n `${logPrefix} Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n console.log(\n `${logPrefix} MediaFile ${index}: type=\"${type}\", url=\"${url.substring(0, 80)}...\", width=\"${width}\", height=\"${height}\"`\n );\n if (!url) {\n console.warn(`${logPrefix} MediaFile ${index} has empty URL`);\n return;\n }\n const isHls = isHlsType(type);\n const isMp4 = isMp4Type(type);\n let accepted = false;\n if (filter === \"hls-only\") {\n accepted = isHls;\n } else if (filter === \"mp4-first\") {\n accepted = isMp4 || isHls;\n } else {\n accepted = true;\n }\n if (!accepted) {\n console.log(\n `${logPrefix} MediaFile ${index} ignored (type=\"${type}\" not accepted by filter \"${filter}\")`\n );\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n mediaFiles.push({\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n });\n console.log(`${logPrefix} Added MediaFile: type=\"${type}\" url=\"${url.substring(0, 80)}...\"`);\n });\n if (filter === \"mp4-first\" && mediaFiles.length > 1) {\n mediaFiles.sort((a, b) => {\n const aIsMp4 = isMp4Type(a.type) ? 0 : 1;\n const bIsMp4 = isMp4Type(b.type) ? 0 : 1;\n return aIsMp4 - bIsMp4;\n });\n }\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n `${logPrefix} No ads available (VAST response indicates no ads)`\n );\n } else {\n console.warn(`${logPrefix} No compatible media files found in VAST XML`);\n }\n return null;\n }\n const trackingUrls = {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: []\n };\n xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n xmlDoc.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough\n };\n } catch (error) {\n console.error(`${logPrefix} Error parsing VAST XML:`, error);\n return null;\n }\n}\nasync function fetchAndParseVastAd(vastTagUrl, filter = \"all\", logPrefix = \"[VastParser]\") {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n Accept: \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n const vastXml = await response.text();\n console.log(`${logPrefix} VAST XML received`);\n console.log(\n `${logPrefix} VAST XML content (first 2000 chars):`,\n vastXml.substring(0, 2e3)\n );\n return parseVastXml(vastXml, filter, logPrefix);\n}\nfunction createEmptyTrackingState() {\n return {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n}\nasync function firePixelWithRetry(url, retries = 2, delayMs = 500, logPrefix = \"[VastParser]\") {\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n await fetch(url, {\n method: \"GET\",\n mode: \"no-cors\",\n cache: \"no-cache\",\n keepalive: true\n });\n return;\n } catch {\n if (attempt < retries) {\n await new Promise((r) => setTimeout(r, delayMs * Math.pow(2, attempt)));\n } else {\n console.warn(`${logPrefix} Tracking pixel failed after ${retries + 1} attempts: ${url}`);\n }\n }\n }\n}\nfunction fireTrackingPixels(urls, sessionId, logPrefix = \"[VastParser]\") {\n if (!urls || urls.length === 0) return;\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n if (sessionId) {\n trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n }\n if (typeof fetch !== \"undefined\") {\n firePixelWithRetry(trackingUrl, 2, 500, logPrefix).catch(() => {\n });\n } else {\n const img = new Image(1, 1);\n img.onerror = () => {\n };\n img.src = trackingUrl;\n }\n console.log(`${logPrefix} Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`${logPrefix} Error firing tracking pixel:`, error);\n }\n });\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createEmptyTrackingState,\n fetchAndParseVastAd,\n fireTrackingPixels,\n parseVastXml\n});\n","export interface VastMediaFile {\n url: string;\n type: string;\n width: number;\n height: number;\n bitrate?: number | undefined;\n}\n\nexport interface VastTrackingUrls {\n impression: string[];\n start: string[];\n firstQuartile: string[];\n midpoint: string[];\n thirdQuartile: string[];\n complete: string[];\n mute: string[];\n unmute: string[];\n pause: string[];\n resume: string[];\n fullscreen: string[];\n exitFullscreen: string[];\n skip: string[];\n error: string[];\n}\n\nexport interface VastAd {\n id: string;\n title: string;\n duration: number;\n mediaFiles: VastMediaFile[];\n trackingUrls: VastTrackingUrls;\n clickThrough?: string | undefined;\n}\n\nexport type MediaFileFilter = \"hls-only\" | \"mp4-first\" | \"all\";\n\nfunction isHlsType(type: string): boolean {\n return type === \"application/x-mpegURL\" || type.includes(\"m3u8\");\n}\n\nfunction isMp4Type(type: string): boolean {\n return type === \"video/mp4\" || type.includes(\"mp4\");\n}\n\nexport function parseVastXml(\n xmlString: string,\n filter: MediaFileFilter = \"all\",\n logPrefix = \"[VastParser]\"\n): VastAd | null {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n `${logPrefix} XML parsing error (malformed VAST XML):`,\n parserError.textContent\n );\n return null;\n }\n\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(`${logPrefix} No Ad element found in VAST XML`);\n return null;\n }\n\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n const isNoAdAvailable =\n adId === \"empty\" ||\n title.toLowerCase().includes(\"no ad available\") ||\n title.toLowerCase() === \"no ad available\";\n\n const durationText =\n xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration =\n parseInt(durationParts[0] || \"0\", 10) * 3600 +\n parseInt(durationParts[1] || \"0\", 10) * 60 +\n Math.round(parseFloat(durationParts[2] || \"0\"));\n\n const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\n console.log(\n `${logPrefix} Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n\n console.log(\n `${logPrefix} MediaFile ${index}: type=\"${type}\", url=\"${url.substring(0, 80)}...\", width=\"${width}\", height=\"${height}\"`\n );\n\n if (!url) {\n console.warn(`${logPrefix} MediaFile ${index} has empty URL`);\n return;\n }\n\n const isHls = isHlsType(type);\n const isMp4 = isMp4Type(type);\n\n let accepted = false;\n if (filter === \"hls-only\") {\n accepted = isHls;\n } else if (filter === \"mp4-first\") {\n accepted = isMp4 || isHls;\n } else {\n accepted = true;\n }\n\n if (!accepted) {\n console.log(\n `${logPrefix} MediaFile ${index} ignored (type=\"${type}\" not accepted by filter \"${filter}\")`\n );\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : undefined;\n\n mediaFiles.push({\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n });\n\n console.log(`${logPrefix} Added MediaFile: type=\"${type}\" url=\"${url.substring(0, 80)}...\"`);\n });\n\n if (filter === \"mp4-first\" && mediaFiles.length > 1) {\n mediaFiles.sort((a, b) => {\n const aIsMp4 = isMp4Type(a.type) ? 0 : 1;\n const bIsMp4 = isMp4Type(b.type) ? 0 : 1;\n return aIsMp4 - bIsMp4;\n });\n }\n\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n `${logPrefix} No ads available (VAST response indicates no ads)`\n );\n } else {\n console.warn(`${logPrefix} No compatible media files found in VAST XML`);\n }\n return null;\n }\n\n const trackingUrls: VastTrackingUrls = {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: [],\n };\n\n xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n\n xmlDoc.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event as keyof VastTrackingUrls;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n\n const clickThrough = xmlDoc\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough,\n };\n } catch (error) {\n console.error(`${logPrefix} Error parsing VAST XML:`, error);\n return null;\n }\n}\n\nexport async function fetchAndParseVastAd(\n vastTagUrl: string,\n filter: MediaFileFilter = \"all\",\n logPrefix = \"[VastParser]\"\n): Promise<VastAd | null> {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n Accept: \"application/xml, text/xml, */*\",\n },\n referrerPolicy: \"no-referrer-when-downgrade\",\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n\n const vastXml = await response.text();\n console.log(`${logPrefix} VAST XML received`);\n console.log(\n `${logPrefix} VAST XML content (first 2000 chars):`,\n vastXml.substring(0, 2000)\n );\n\n return parseVastXml(vastXml, filter, logPrefix);\n}\n\nexport function createEmptyTrackingState() {\n return {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n}\n\nasync function firePixelWithRetry(\n url: string,\n retries = 2,\n delayMs = 500,\n logPrefix = \"[VastParser]\"\n): Promise<void> {\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n await fetch(url, {\n method: \"GET\",\n mode: \"no-cors\",\n cache: \"no-cache\",\n keepalive: true,\n });\n return;\n } catch {\n if (attempt < retries) {\n await new Promise((r) => setTimeout(r, delayMs * Math.pow(2, attempt)));\n } else {\n console.warn(`${logPrefix} Tracking pixel failed after ${retries + 1} attempts: ${url}`);\n }\n }\n }\n}\n\nexport function fireTrackingPixels(\n urls: string[],\n sessionId?: string,\n logPrefix = \"[VastParser]\"\n): void {\n if (!urls || urls.length === 0) return;\n\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n\n if (sessionId) {\n trackingUrl = `${trackingUrl}${\n trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n }session_id=${sessionId}`;\n }\n\n if (typeof fetch !== \"undefined\") {\n firePixelWithRetry(trackingUrl, 2, 500, logPrefix).catch(() => {});\n } else {\n const img = new Image(1, 1);\n img.onerror = () => {};\n img.src = trackingUrl;\n }\n\n console.log(`${logPrefix} Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`${logPrefix} Error firing tracking pixel:`, error);\n }\n });\n}\n"]}
@@ -1,45 +0,0 @@
1
- interface VastMediaFile {
2
- url: string;
3
- type: string;
4
- width: number;
5
- height: number;
6
- bitrate?: number | undefined;
7
- }
8
- interface VastTrackingUrls {
9
- impression: string[];
10
- start: string[];
11
- firstQuartile: string[];
12
- midpoint: string[];
13
- thirdQuartile: string[];
14
- complete: string[];
15
- mute: string[];
16
- unmute: string[];
17
- pause: string[];
18
- resume: string[];
19
- fullscreen: string[];
20
- exitFullscreen: string[];
21
- skip: string[];
22
- error: string[];
23
- }
24
- interface VastAd {
25
- id: string;
26
- title: string;
27
- duration: number;
28
- mediaFiles: VastMediaFile[];
29
- trackingUrls: VastTrackingUrls;
30
- clickThrough?: string | undefined;
31
- }
32
- type MediaFileFilter = "hls-only" | "mp4-first" | "all";
33
- declare function parseVastXml(xmlString: string, filter?: MediaFileFilter, logPrefix?: string): VastAd | null;
34
- declare function fetchAndParseVastAd(vastTagUrl: string, filter?: MediaFileFilter, logPrefix?: string): Promise<VastAd | null>;
35
- declare function createEmptyTrackingState(): {
36
- impression: boolean;
37
- start: boolean;
38
- firstQuartile: boolean;
39
- midpoint: boolean;
40
- thirdQuartile: boolean;
41
- complete: boolean;
42
- };
43
- declare function fireTrackingPixels(urls: string[], sessionId?: string, logPrefix?: string): void;
44
-
45
- export { type MediaFileFilter, type VastAd, type VastMediaFile, type VastTrackingUrls, createEmptyTrackingState, fetchAndParseVastAd, fireTrackingPixels, parseVastXml };