stormcloud-video-player 0.8.16 → 0.8.18
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/dist/stormcloud-vp.min.js +2 -2
- package/lib/index.cjs +4449 -4221
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +18 -195
- package/lib/index.d.ts +18 -195
- package/lib/index.js +4455 -4219
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +2275 -0
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -0
- package/lib/player/AdBreakOrchestrator.d.cts +62 -0
- package/lib/player/AdPreloadPool.cjs +673 -0
- package/lib/player/AdPreloadPool.cjs.map +1 -0
- package/lib/player/AdPreloadPool.d.cts +37 -0
- package/lib/player/AdTimingService.cjs +841 -0
- package/lib/player/AdTimingService.cjs.map +1 -0
- package/lib/player/AdTimingService.d.cts +88 -0
- package/lib/player/HlsEngine.cjs +1502 -0
- package/lib/player/HlsEngine.cjs.map +1 -0
- package/lib/player/HlsEngine.d.cts +38 -0
- package/lib/player/PlaceholderLayer.cjs +191 -0
- package/lib/player/PlaceholderLayer.cjs.map +1 -0
- package/lib/player/PlaceholderLayer.d.cts +12 -0
- package/lib/player/PlayerControls.cjs +225 -0
- package/lib/player/PlayerControls.cjs.map +1 -0
- package/lib/player/PlayerControls.d.cts +13 -0
- package/lib/player/Scte35CueManager.cjs +413 -0
- package/lib/player/Scte35CueManager.cjs.map +1 -0
- package/lib/player/Scte35CueManager.d.cts +43 -0
- package/lib/player/Scte35Parser.cjs +945 -0
- package/lib/player/Scte35Parser.cjs.map +1 -0
- package/lib/player/Scte35Parser.d.cts +23 -0
- package/lib/player/StormcloudVideoPlayer.cjs +4411 -4168
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +19 -196
- package/lib/player/VmapManager.cjs +1706 -0
- package/lib/player/VmapManager.cjs.map +1 -0
- package/lib/player/VmapManager.d.cts +38 -0
- package/lib/player/playerTypes.cjs +49 -0
- package/lib/player/playerTypes.cjs.map +1 -0
- package/lib/player/playerTypes.d.cts +20 -0
- package/lib/players/HlsPlayer.cjs +4411 -4169
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +4411 -4169
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/{types-CWWADkvd.d.cts → types-DNiBmPKK.d.cts} +18 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +4449 -4221
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,1706 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function _array_like_to_array(arr, len) {
|
|
3
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
4
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
5
|
+
return arr2;
|
|
6
|
+
}
|
|
7
|
+
function _array_with_holes(arr) {
|
|
8
|
+
if (Array.isArray(arr)) return arr;
|
|
9
|
+
}
|
|
10
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
11
|
+
try {
|
|
12
|
+
var info = gen[key](arg);
|
|
13
|
+
var value = info.value;
|
|
14
|
+
} catch (error) {
|
|
15
|
+
reject(error);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (info.done) {
|
|
19
|
+
resolve(value);
|
|
20
|
+
} else {
|
|
21
|
+
Promise.resolve(value).then(_next, _throw);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function _async_to_generator(fn) {
|
|
25
|
+
return function() {
|
|
26
|
+
var self = this, args = arguments;
|
|
27
|
+
return new Promise(function(resolve, reject) {
|
|
28
|
+
var gen = fn.apply(self, args);
|
|
29
|
+
function _next(value) {
|
|
30
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
31
|
+
}
|
|
32
|
+
function _throw(err) {
|
|
33
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
34
|
+
}
|
|
35
|
+
_next(undefined);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function _class_call_check(instance, Constructor) {
|
|
40
|
+
if (!(instance instanceof Constructor)) {
|
|
41
|
+
throw new TypeError("Cannot call a class as a function");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function _defineProperties(target, props) {
|
|
45
|
+
for(var i = 0; i < props.length; i++){
|
|
46
|
+
var descriptor = props[i];
|
|
47
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
48
|
+
descriptor.configurable = true;
|
|
49
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
50
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
54
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
55
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
56
|
+
return Constructor;
|
|
57
|
+
}
|
|
58
|
+
function _define_property(obj, key, value) {
|
|
59
|
+
if (key in obj) {
|
|
60
|
+
Object.defineProperty(obj, key, {
|
|
61
|
+
value: value,
|
|
62
|
+
enumerable: true,
|
|
63
|
+
configurable: true,
|
|
64
|
+
writable: true
|
|
65
|
+
});
|
|
66
|
+
} else {
|
|
67
|
+
obj[key] = value;
|
|
68
|
+
}
|
|
69
|
+
return obj;
|
|
70
|
+
}
|
|
71
|
+
function _iterable_to_array_limit(arr, i) {
|
|
72
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
73
|
+
if (_i == null) return;
|
|
74
|
+
var _arr = [];
|
|
75
|
+
var _n = true;
|
|
76
|
+
var _d = false;
|
|
77
|
+
var _s, _e;
|
|
78
|
+
try {
|
|
79
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
80
|
+
_arr.push(_s.value);
|
|
81
|
+
if (i && _arr.length === i) break;
|
|
82
|
+
}
|
|
83
|
+
} catch (err) {
|
|
84
|
+
_d = true;
|
|
85
|
+
_e = err;
|
|
86
|
+
} finally{
|
|
87
|
+
try {
|
|
88
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
89
|
+
} finally{
|
|
90
|
+
if (_d) throw _e;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return _arr;
|
|
94
|
+
}
|
|
95
|
+
function _non_iterable_rest() {
|
|
96
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
97
|
+
}
|
|
98
|
+
function _object_spread(target) {
|
|
99
|
+
for(var i = 1; i < arguments.length; i++){
|
|
100
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
101
|
+
var ownKeys = Object.keys(source);
|
|
102
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
103
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
104
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
ownKeys.forEach(function(key) {
|
|
108
|
+
_define_property(target, key, source[key]);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return target;
|
|
112
|
+
}
|
|
113
|
+
function ownKeys(object, enumerableOnly) {
|
|
114
|
+
var keys = Object.keys(object);
|
|
115
|
+
if (Object.getOwnPropertySymbols) {
|
|
116
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
117
|
+
if (enumerableOnly) {
|
|
118
|
+
symbols = symbols.filter(function(sym) {
|
|
119
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
keys.push.apply(keys, symbols);
|
|
123
|
+
}
|
|
124
|
+
return keys;
|
|
125
|
+
}
|
|
126
|
+
function _object_spread_props(target, source) {
|
|
127
|
+
source = source != null ? source : {};
|
|
128
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
129
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
130
|
+
} else {
|
|
131
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
132
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return target;
|
|
136
|
+
}
|
|
137
|
+
function _sliced_to_array(arr, i) {
|
|
138
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
139
|
+
}
|
|
140
|
+
function _type_of(obj) {
|
|
141
|
+
"@swc/helpers - typeof";
|
|
142
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
143
|
+
}
|
|
144
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
145
|
+
if (!o) return;
|
|
146
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
147
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
148
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
149
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
150
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
151
|
+
}
|
|
152
|
+
function _ts_generator(thisArg, body) {
|
|
153
|
+
var f, y, t, _ = {
|
|
154
|
+
label: 0,
|
|
155
|
+
sent: function() {
|
|
156
|
+
if (t[0] & 1) throw t[1];
|
|
157
|
+
return t[1];
|
|
158
|
+
},
|
|
159
|
+
trys: [],
|
|
160
|
+
ops: []
|
|
161
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
162
|
+
return d(g, "next", {
|
|
163
|
+
value: verb(0)
|
|
164
|
+
}), d(g, "throw", {
|
|
165
|
+
value: verb(1)
|
|
166
|
+
}), d(g, "return", {
|
|
167
|
+
value: verb(2)
|
|
168
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
169
|
+
value: function() {
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
}), g;
|
|
173
|
+
function verb(n) {
|
|
174
|
+
return function(v) {
|
|
175
|
+
return step([
|
|
176
|
+
n,
|
|
177
|
+
v
|
|
178
|
+
]);
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function step(op) {
|
|
182
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
183
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
184
|
+
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;
|
|
185
|
+
if (y = 0, t) op = [
|
|
186
|
+
op[0] & 2,
|
|
187
|
+
t.value
|
|
188
|
+
];
|
|
189
|
+
switch(op[0]){
|
|
190
|
+
case 0:
|
|
191
|
+
case 1:
|
|
192
|
+
t = op;
|
|
193
|
+
break;
|
|
194
|
+
case 4:
|
|
195
|
+
_.label++;
|
|
196
|
+
return {
|
|
197
|
+
value: op[1],
|
|
198
|
+
done: false
|
|
199
|
+
};
|
|
200
|
+
case 5:
|
|
201
|
+
_.label++;
|
|
202
|
+
y = op[1];
|
|
203
|
+
op = [
|
|
204
|
+
0
|
|
205
|
+
];
|
|
206
|
+
continue;
|
|
207
|
+
case 7:
|
|
208
|
+
op = _.ops.pop();
|
|
209
|
+
_.trys.pop();
|
|
210
|
+
continue;
|
|
211
|
+
default:
|
|
212
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
213
|
+
_ = 0;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
217
|
+
_.label = op[1];
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
221
|
+
_.label = t[1];
|
|
222
|
+
t = op;
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
if (t && _.label < t[2]) {
|
|
226
|
+
_.label = t[2];
|
|
227
|
+
_.ops.push(op);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
if (t[2]) _.ops.pop();
|
|
231
|
+
_.trys.pop();
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
op = body.call(thisArg, _);
|
|
235
|
+
} catch (e) {
|
|
236
|
+
op = [
|
|
237
|
+
6,
|
|
238
|
+
e
|
|
239
|
+
];
|
|
240
|
+
y = 0;
|
|
241
|
+
} finally{
|
|
242
|
+
f = t = 0;
|
|
243
|
+
}
|
|
244
|
+
if (op[0] & 5) throw op[1];
|
|
245
|
+
return {
|
|
246
|
+
value: op[0] ? op[1] : void 0,
|
|
247
|
+
done: true
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
var __create = Object.create;
|
|
252
|
+
var __defProp = Object.defineProperty;
|
|
253
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
254
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
255
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
256
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
257
|
+
var __export = function __export(target, all) {
|
|
258
|
+
for(var name in all)__defProp(target, name, {
|
|
259
|
+
get: all[name],
|
|
260
|
+
enumerable: true
|
|
261
|
+
});
|
|
262
|
+
};
|
|
263
|
+
var __copyProps = function __copyProps(to, from, except, desc) {
|
|
264
|
+
if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
|
|
265
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
266
|
+
try {
|
|
267
|
+
var _loop = function() {
|
|
268
|
+
var key = _step.value;
|
|
269
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
270
|
+
get: function get() {
|
|
271
|
+
return from[key];
|
|
272
|
+
},
|
|
273
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
|
|
277
|
+
} catch (err) {
|
|
278
|
+
_didIteratorError = true;
|
|
279
|
+
_iteratorError = err;
|
|
280
|
+
} finally{
|
|
281
|
+
try {
|
|
282
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
283
|
+
_iterator.return();
|
|
284
|
+
}
|
|
285
|
+
} finally{
|
|
286
|
+
if (_didIteratorError) {
|
|
287
|
+
throw _iteratorError;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return to;
|
|
293
|
+
};
|
|
294
|
+
var __toESM = function __toESM(mod, isNodeMode, target) {
|
|
295
|
+
return target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM
|
|
296
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
297
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
298
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
299
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
300
|
+
value: mod,
|
|
301
|
+
enumerable: true
|
|
302
|
+
}) : target, mod);
|
|
303
|
+
};
|
|
304
|
+
var __toCommonJS = function __toCommonJS(mod) {
|
|
305
|
+
return __copyProps(__defProp({}, "__esModule", {
|
|
306
|
+
value: true
|
|
307
|
+
}), mod);
|
|
308
|
+
};
|
|
309
|
+
// src/player/VmapManager.ts
|
|
310
|
+
var VmapManager_exports = {};
|
|
311
|
+
__export(VmapManager_exports, {
|
|
312
|
+
VmapManager: function VmapManager1() {
|
|
313
|
+
return VmapManager;
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
module.exports = __toCommonJS(VmapManager_exports);
|
|
317
|
+
// src/utils/vastMacros.ts
|
|
318
|
+
function generateCorrelator() {
|
|
319
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
320
|
+
try {
|
|
321
|
+
var _buf_, _buf_1;
|
|
322
|
+
var buf = new Uint32Array(2);
|
|
323
|
+
crypto.getRandomValues(buf);
|
|
324
|
+
var value = ((_buf_ = buf[0]) !== null && _buf_ !== void 0 ? _buf_ : 0) * 2097152 + (((_buf_1 = buf[1]) !== null && _buf_1 !== void 0 ? _buf_1 : 0) & 2097151);
|
|
325
|
+
if (value > 0) {
|
|
326
|
+
return String(value);
|
|
327
|
+
}
|
|
328
|
+
} catch (unused) {}
|
|
329
|
+
}
|
|
330
|
+
return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
|
|
331
|
+
}
|
|
332
|
+
var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
|
|
333
|
+
var CTV_UNSUPPORTED_PARAMS = [
|
|
334
|
+
"description_url",
|
|
335
|
+
"tfcd",
|
|
336
|
+
"npa",
|
|
337
|
+
"min_ad_duration",
|
|
338
|
+
"max_ad_duration",
|
|
339
|
+
"unviewed_position_start",
|
|
340
|
+
"impl",
|
|
341
|
+
"scor",
|
|
342
|
+
"vad_type",
|
|
343
|
+
"gdpr",
|
|
344
|
+
"gdpr_consent",
|
|
345
|
+
"us_privacy"
|
|
346
|
+
];
|
|
347
|
+
function applyVastMacros(baseUrl, ctx) {
|
|
348
|
+
var url;
|
|
349
|
+
try {
|
|
350
|
+
url = new URL(baseUrl);
|
|
351
|
+
} catch (unused) {
|
|
352
|
+
return replaceCorrelatorFallback(baseUrl, ctx.correlator);
|
|
353
|
+
}
|
|
354
|
+
var params = url.searchParams;
|
|
355
|
+
params.set("correlator", ctx.correlator);
|
|
356
|
+
if (ctx.isCtv) {
|
|
357
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
358
|
+
try {
|
|
359
|
+
for(var _iterator = CTV_UNSUPPORTED_PARAMS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
360
|
+
var key = _step.value;
|
|
361
|
+
params.delete(key);
|
|
362
|
+
}
|
|
363
|
+
} catch (err) {
|
|
364
|
+
_didIteratorError = true;
|
|
365
|
+
_iteratorError = err;
|
|
366
|
+
} finally{
|
|
367
|
+
try {
|
|
368
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
369
|
+
_iterator.return();
|
|
370
|
+
}
|
|
371
|
+
} finally{
|
|
372
|
+
if (_didIteratorError) {
|
|
373
|
+
throw _iteratorError;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
} else {
|
|
378
|
+
params.set("scor", ctx.streamCorrelator);
|
|
379
|
+
}
|
|
380
|
+
if (ctx.pod != null) {
|
|
381
|
+
params.set("pod", String(ctx.pod));
|
|
382
|
+
}
|
|
383
|
+
if (ctx.adPosition != null) {
|
|
384
|
+
params.set("ppos", String(ctx.adPosition));
|
|
385
|
+
}
|
|
386
|
+
var requestUrl = ctx.contentUrl || ctx.pageUrl;
|
|
387
|
+
if (requestUrl) {
|
|
388
|
+
params.set("url", requestUrl);
|
|
389
|
+
if (!ctx.isCtv) {
|
|
390
|
+
params.set("description_url", requestUrl);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (ctx.adWillPlayMuted != null) {
|
|
394
|
+
params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
|
|
395
|
+
}
|
|
396
|
+
if (ctx.adWillAutoPlay != null) {
|
|
397
|
+
params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
|
|
398
|
+
}
|
|
399
|
+
if (ctx.appId) {
|
|
400
|
+
params.set("msid", ctx.appId);
|
|
401
|
+
}
|
|
402
|
+
if (ctx.appName) {
|
|
403
|
+
params.set("an", ctx.appName);
|
|
404
|
+
}
|
|
405
|
+
if (ctx.sessionId) {
|
|
406
|
+
params.set("sid", ctx.sessionId);
|
|
407
|
+
}
|
|
408
|
+
if (ctx.deviceTypeHint != null) {
|
|
409
|
+
params.set("dth", String(ctx.deviceTypeHint));
|
|
410
|
+
} else if (ctx.isCtv) {
|
|
411
|
+
params.set("dth", "5");
|
|
412
|
+
}
|
|
413
|
+
if (ctx.deviceId && ctx.deviceIdType) {
|
|
414
|
+
params.set("rdid", ctx.deviceId);
|
|
415
|
+
params.set("idtype", ctx.deviceIdType);
|
|
416
|
+
params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
|
|
417
|
+
} else {
|
|
418
|
+
params.delete("rdid");
|
|
419
|
+
params.delete("idtype");
|
|
420
|
+
params.delete("is_lat");
|
|
421
|
+
}
|
|
422
|
+
if (!ctx.isCtv) {
|
|
423
|
+
var consent = ctx.consent;
|
|
424
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
|
|
425
|
+
params.set("gdpr", consent.gdpr);
|
|
426
|
+
}
|
|
427
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
|
|
428
|
+
params.set("gdpr_consent", consent.gdprConsent);
|
|
429
|
+
}
|
|
430
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
|
|
431
|
+
params.set("us_privacy", consent.usPrivacy);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (ctx.adTest) {
|
|
435
|
+
params.set("adtest", "on");
|
|
436
|
+
}
|
|
437
|
+
var staleKeys = [];
|
|
438
|
+
params.forEach(function(value, key) {
|
|
439
|
+
if (UNEXPANDED_MACRO_PATTERN.test(value)) {
|
|
440
|
+
staleKeys.push(key);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
444
|
+
try {
|
|
445
|
+
for(var _iterator1 = staleKeys[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
446
|
+
var key1 = _step1.value;
|
|
447
|
+
params.delete(key1);
|
|
448
|
+
}
|
|
449
|
+
} catch (err) {
|
|
450
|
+
_didIteratorError1 = true;
|
|
451
|
+
_iteratorError1 = err;
|
|
452
|
+
} finally{
|
|
453
|
+
try {
|
|
454
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
455
|
+
_iterator1.return();
|
|
456
|
+
}
|
|
457
|
+
} finally{
|
|
458
|
+
if (_didIteratorError1) {
|
|
459
|
+
throw _iteratorError1;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return url.toString();
|
|
464
|
+
}
|
|
465
|
+
function replaceCorrelatorFallback(baseUrl, correlator) {
|
|
466
|
+
var correlatorRegex = /([?&])correlator=([^&]*)/;
|
|
467
|
+
if (correlatorRegex.test(baseUrl)) {
|
|
468
|
+
return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
|
|
469
|
+
}
|
|
470
|
+
var sep = baseUrl.includes("?") ? "&" : "?";
|
|
471
|
+
return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
|
|
472
|
+
}
|
|
473
|
+
// src/utils/ctvVastSignals.ts
|
|
474
|
+
var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
|
|
475
|
+
var AIRY_APP_NAME = "AiryTV Movies & TV";
|
|
476
|
+
var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
|
|
477
|
+
var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
|
|
478
|
+
var DEVICE_ID_STORAGE_KEYS = [
|
|
479
|
+
"rdid",
|
|
480
|
+
"ifa",
|
|
481
|
+
"advertisingId",
|
|
482
|
+
"advertising_id",
|
|
483
|
+
"deviceAdvertisingId",
|
|
484
|
+
"aaid",
|
|
485
|
+
"adid",
|
|
486
|
+
"rida",
|
|
487
|
+
"tifa"
|
|
488
|
+
];
|
|
489
|
+
function resolveCtvVastSignals() {
|
|
490
|
+
var _ref, _bridgeSignals_limitAdTracking;
|
|
491
|
+
var bridgeSignals = readNativeBridgeSignals();
|
|
492
|
+
var deviceId = bridgeSignals.deviceId || readStoredDeviceId();
|
|
493
|
+
var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || inferDeviceIdType();
|
|
494
|
+
var contentUrl = bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL;
|
|
495
|
+
return _object_spread_props(_object_spread({
|
|
496
|
+
contentUrl: contentUrl,
|
|
497
|
+
appId: AIRY_ANDROID_APP_ID,
|
|
498
|
+
appName: AIRY_APP_NAME,
|
|
499
|
+
sessionId: getOrCreateCtvSessionId()
|
|
500
|
+
}, deviceId ? {
|
|
501
|
+
deviceId: deviceId
|
|
502
|
+
} : {}, deviceId && deviceIdType ? {
|
|
503
|
+
deviceIdType: deviceIdType
|
|
504
|
+
} : {}, deviceId ? {
|
|
505
|
+
limitAdTracking: (_ref = (_bridgeSignals_limitAdTracking = bridgeSignals.limitAdTracking) !== null && _bridgeSignals_limitAdTracking !== void 0 ? _bridgeSignals_limitAdTracking : readStoredLimitAdTracking()) !== null && _ref !== void 0 ? _ref : false
|
|
506
|
+
} : {}), {
|
|
507
|
+
deviceTypeHint: 5
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
function getOrCreateCtvSessionId() {
|
|
511
|
+
var existing = readStoredString(CTV_SESSION_STORAGE_KEY);
|
|
512
|
+
if (existing) {
|
|
513
|
+
return existing;
|
|
514
|
+
}
|
|
515
|
+
var sessionId = createUuid();
|
|
516
|
+
try {
|
|
517
|
+
var _window_localStorage;
|
|
518
|
+
(_window_localStorage = window.localStorage) === null || _window_localStorage === void 0 ? void 0 : _window_localStorage.setItem(CTV_SESSION_STORAGE_KEY, sessionId);
|
|
519
|
+
} catch (unused) {}
|
|
520
|
+
return sessionId;
|
|
521
|
+
}
|
|
522
|
+
function createUuid() {
|
|
523
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
524
|
+
return crypto.randomUUID();
|
|
525
|
+
}
|
|
526
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(char) {
|
|
527
|
+
var value = Math.floor(Math.random() * 16);
|
|
528
|
+
var nibble = char === "x" ? value : value & 3 | 8;
|
|
529
|
+
return nibble.toString(16);
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
function readNativeBridgeSignals() {
|
|
533
|
+
if (typeof window === "undefined") {
|
|
534
|
+
return {};
|
|
535
|
+
}
|
|
536
|
+
var candidates = [
|
|
537
|
+
window.__STORMCLOUD_CTV_AD_INFO__,
|
|
538
|
+
window.__STORMCLOUD_CTV__,
|
|
539
|
+
window.stormcloudCtv,
|
|
540
|
+
window.AiryTV,
|
|
541
|
+
window.Android
|
|
542
|
+
].filter(Boolean);
|
|
543
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
544
|
+
try {
|
|
545
|
+
for(var _iterator = candidates[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
546
|
+
var source = _step.value;
|
|
547
|
+
var contentUrl = readBridgeValue(source, [
|
|
548
|
+
"contentUrl",
|
|
549
|
+
"url",
|
|
550
|
+
"videoUrl",
|
|
551
|
+
"canonicalUrl"
|
|
552
|
+
]) || void 0;
|
|
553
|
+
var deviceId = readBridgeValue(source, [
|
|
554
|
+
"rdid",
|
|
555
|
+
"ifa",
|
|
556
|
+
"advertisingId",
|
|
557
|
+
"adId",
|
|
558
|
+
"deviceId"
|
|
559
|
+
]) || void 0;
|
|
560
|
+
if (!contentUrl && !deviceId) continue;
|
|
561
|
+
var deviceIdType = readBridgeValue(source, [
|
|
562
|
+
"idtype",
|
|
563
|
+
"deviceIdType",
|
|
564
|
+
"advertisingIdType"
|
|
565
|
+
]) || inferDeviceIdType();
|
|
566
|
+
var limitAdTracking = readBridgeBoolean(source, [
|
|
567
|
+
"is_lat",
|
|
568
|
+
"limitAdTracking",
|
|
569
|
+
"limitedAdTracking",
|
|
570
|
+
"lat"
|
|
571
|
+
]);
|
|
572
|
+
return _object_spread({}, contentUrl ? {
|
|
573
|
+
contentUrl: contentUrl
|
|
574
|
+
} : {}, deviceId ? {
|
|
575
|
+
deviceId: deviceId
|
|
576
|
+
} : {}, deviceId && deviceIdType ? {
|
|
577
|
+
deviceIdType: deviceIdType
|
|
578
|
+
} : {}, deviceId && limitAdTracking != null ? {
|
|
579
|
+
limitAdTracking: limitAdTracking
|
|
580
|
+
} : {});
|
|
581
|
+
}
|
|
582
|
+
} catch (err) {
|
|
583
|
+
_didIteratorError = true;
|
|
584
|
+
_iteratorError = err;
|
|
585
|
+
} finally{
|
|
586
|
+
try {
|
|
587
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
588
|
+
_iterator.return();
|
|
589
|
+
}
|
|
590
|
+
} finally{
|
|
591
|
+
if (_didIteratorError) {
|
|
592
|
+
throw _iteratorError;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
return {};
|
|
597
|
+
}
|
|
598
|
+
function readBridgeValue(source, keys) {
|
|
599
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
600
|
+
try {
|
|
601
|
+
for(var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
602
|
+
var key = _step.value;
|
|
603
|
+
var value = source === null || source === void 0 ? void 0 : source[key];
|
|
604
|
+
if (typeof value === "string" && value) {
|
|
605
|
+
return value;
|
|
606
|
+
}
|
|
607
|
+
if (typeof value === "function") {
|
|
608
|
+
try {
|
|
609
|
+
var result = value.call(source);
|
|
610
|
+
if (typeof result === "string" && result) {
|
|
611
|
+
return result;
|
|
612
|
+
}
|
|
613
|
+
} catch (unused) {}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
} catch (err) {
|
|
617
|
+
_didIteratorError = true;
|
|
618
|
+
_iteratorError = err;
|
|
619
|
+
} finally{
|
|
620
|
+
try {
|
|
621
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
622
|
+
_iterator.return();
|
|
623
|
+
}
|
|
624
|
+
} finally{
|
|
625
|
+
if (_didIteratorError) {
|
|
626
|
+
throw _iteratorError;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
return void 0;
|
|
631
|
+
}
|
|
632
|
+
function readBridgeBoolean(source, keys) {
|
|
633
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
634
|
+
try {
|
|
635
|
+
for(var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
636
|
+
var key = _step.value;
|
|
637
|
+
var value = source === null || source === void 0 ? void 0 : source[key];
|
|
638
|
+
var normalized = normalizeBoolean(value);
|
|
639
|
+
if (normalized != null) {
|
|
640
|
+
return normalized;
|
|
641
|
+
}
|
|
642
|
+
if (typeof value === "function") {
|
|
643
|
+
try {
|
|
644
|
+
var result = normalizeBoolean(value.call(source));
|
|
645
|
+
if (result != null) {
|
|
646
|
+
return result;
|
|
647
|
+
}
|
|
648
|
+
} catch (unused) {}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
} catch (err) {
|
|
652
|
+
_didIteratorError = true;
|
|
653
|
+
_iteratorError = err;
|
|
654
|
+
} finally{
|
|
655
|
+
try {
|
|
656
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
657
|
+
_iterator.return();
|
|
658
|
+
}
|
|
659
|
+
} finally{
|
|
660
|
+
if (_didIteratorError) {
|
|
661
|
+
throw _iteratorError;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
return void 0;
|
|
666
|
+
}
|
|
667
|
+
function readStoredDeviceId() {
|
|
668
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
669
|
+
try {
|
|
670
|
+
for(var _iterator = DEVICE_ID_STORAGE_KEYS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
671
|
+
var key = _step.value;
|
|
672
|
+
var value = readStoredString(key);
|
|
673
|
+
if (value) {
|
|
674
|
+
return value;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
} catch (err) {
|
|
678
|
+
_didIteratorError = true;
|
|
679
|
+
_iteratorError = err;
|
|
680
|
+
} finally{
|
|
681
|
+
try {
|
|
682
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
683
|
+
_iterator.return();
|
|
684
|
+
}
|
|
685
|
+
} finally{
|
|
686
|
+
if (_didIteratorError) {
|
|
687
|
+
throw _iteratorError;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
return void 0;
|
|
692
|
+
}
|
|
693
|
+
function readStoredString(key) {
|
|
694
|
+
if (typeof window === "undefined") {
|
|
695
|
+
return void 0;
|
|
696
|
+
}
|
|
697
|
+
try {
|
|
698
|
+
var _window_localStorage;
|
|
699
|
+
var value = (_window_localStorage = window.localStorage) === null || _window_localStorage === void 0 ? void 0 : _window_localStorage.getItem(key);
|
|
700
|
+
return value || void 0;
|
|
701
|
+
} catch (unused) {
|
|
702
|
+
return void 0;
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
function readStoredLimitAdTracking() {
|
|
706
|
+
return normalizeBoolean(readStoredString("limitAdTracking") || readStoredString("limitedAdTracking") || readStoredString("is_lat"));
|
|
707
|
+
}
|
|
708
|
+
function normalizeBoolean(value) {
|
|
709
|
+
if (typeof value === "boolean") {
|
|
710
|
+
return value;
|
|
711
|
+
}
|
|
712
|
+
if (typeof value === "number") {
|
|
713
|
+
return value === 1;
|
|
714
|
+
}
|
|
715
|
+
if (typeof value === "string") {
|
|
716
|
+
var normalized = value.toLowerCase();
|
|
717
|
+
if (normalized === "1" || normalized === "true" || normalized === "yes") {
|
|
718
|
+
return true;
|
|
719
|
+
}
|
|
720
|
+
if (normalized === "0" || normalized === "false" || normalized === "no") {
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
return void 0;
|
|
725
|
+
}
|
|
726
|
+
function inferDeviceIdType() {
|
|
727
|
+
if (typeof navigator === "undefined") {
|
|
728
|
+
return void 0;
|
|
729
|
+
}
|
|
730
|
+
var ua = navigator.userAgent;
|
|
731
|
+
if (/Roku/i.test(ua)) return "rida";
|
|
732
|
+
if (/Tizen|Samsung/i.test(ua)) return "tifa";
|
|
733
|
+
if (/AppleTV/i.test(ua)) return "tvOS";
|
|
734
|
+
if (/AFT|Fire TV|Amazon/i.test(ua)) return "afai";
|
|
735
|
+
if (/Web0S|webOS|LG/i.test(ua)) return "lgudid";
|
|
736
|
+
if (/Android|Google TV/i.test(ua)) return "aaid";
|
|
737
|
+
return void 0;
|
|
738
|
+
}
|
|
739
|
+
// src/utils/mqttConfig.ts
|
|
740
|
+
var DEFAULT_MQTT_CONFIG = {
|
|
741
|
+
enabled: true,
|
|
742
|
+
brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
|
|
743
|
+
brokerPort: 8883,
|
|
744
|
+
wsPort: 8084,
|
|
745
|
+
username: "for-sonifi",
|
|
746
|
+
password: "sonifi-mqtt",
|
|
747
|
+
topicPrefix: "adstorm/players",
|
|
748
|
+
qos: 1
|
|
749
|
+
};
|
|
750
|
+
var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
|
|
751
|
+
function isMQTTEnabled() {
|
|
752
|
+
return mqttConfig.enabled;
|
|
753
|
+
}
|
|
754
|
+
function buildMQTTBrokerUrl() {
|
|
755
|
+
if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
|
|
756
|
+
return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
|
|
757
|
+
}
|
|
758
|
+
function buildPlayerTopic(licenseKey, channel) {
|
|
759
|
+
return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
|
|
760
|
+
}
|
|
761
|
+
// src/utils/mqttClient.ts
|
|
762
|
+
var import_mqtt = __toESM(require("mqtt"), 1);
|
|
763
|
+
var LOG = "[StormcloudVideoPlayer][MQTT]";
|
|
764
|
+
var client = null;
|
|
765
|
+
var status = "disconnected";
|
|
766
|
+
function initMQTTClient() {
|
|
767
|
+
if (client || !isMQTTEnabled()) return;
|
|
768
|
+
var url = buildMQTTBrokerUrl();
|
|
769
|
+
status = "connecting";
|
|
770
|
+
var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
|
|
771
|
+
try {
|
|
772
|
+
client = import_mqtt.default.connect(url, {
|
|
773
|
+
clientId: clientId,
|
|
774
|
+
username: mqttConfig.username,
|
|
775
|
+
password: mqttConfig.password,
|
|
776
|
+
keepalive: 60,
|
|
777
|
+
clean: true,
|
|
778
|
+
reconnectPeriod: 5e3,
|
|
779
|
+
connectTimeout: 1e4,
|
|
780
|
+
queueQoSZero: false
|
|
781
|
+
});
|
|
782
|
+
} catch (err) {
|
|
783
|
+
status = "error";
|
|
784
|
+
console.warn("".concat(LOG, " connect() threw:"), err);
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
client.on("connect", function() {
|
|
788
|
+
status = "connected";
|
|
789
|
+
console.info("".concat(LOG, " connected to ").concat(url));
|
|
790
|
+
});
|
|
791
|
+
client.on("reconnect", function() {
|
|
792
|
+
status = "connecting";
|
|
793
|
+
console.info("".concat(LOG, " reconnecting…"));
|
|
794
|
+
});
|
|
795
|
+
client.on("offline", function() {
|
|
796
|
+
status = "disconnected";
|
|
797
|
+
console.warn("".concat(LOG, " offline"));
|
|
798
|
+
});
|
|
799
|
+
client.on("error", function(err) {
|
|
800
|
+
status = "error";
|
|
801
|
+
console.warn("".concat(LOG, " error:"), err.message);
|
|
802
|
+
});
|
|
803
|
+
client.on("close", function() {
|
|
804
|
+
if (status === "connected") {
|
|
805
|
+
status = "disconnected";
|
|
806
|
+
}
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
function ensureMQTTClient() {
|
|
810
|
+
if (isMQTTEnabled() && !client) {
|
|
811
|
+
initMQTTClient();
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
function publishMQTT(topic, payload) {
|
|
815
|
+
if (!isMQTTEnabled()) {
|
|
816
|
+
return false;
|
|
817
|
+
}
|
|
818
|
+
ensureMQTTClient();
|
|
819
|
+
if (!client) {
|
|
820
|
+
return false;
|
|
821
|
+
}
|
|
822
|
+
try {
|
|
823
|
+
client.publish(topic, JSON.stringify(payload), {
|
|
824
|
+
qos: mqttConfig.qos
|
|
825
|
+
});
|
|
826
|
+
return true;
|
|
827
|
+
} catch (err) {
|
|
828
|
+
console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
|
|
829
|
+
return false;
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
// src/utils/tracking.ts
|
|
833
|
+
var cachedBrowserId = null;
|
|
834
|
+
function getClientInfo() {
|
|
835
|
+
var _screen, _screen1, _screen2, _screen3, _screen_orientation, _screen4, _screen5, _window, _window1, _window_screen_orientation, _window_screen, _navigator_languages;
|
|
836
|
+
var ua = navigator.userAgent;
|
|
837
|
+
var platform = navigator.platform;
|
|
838
|
+
var vendor = navigator.vendor || "";
|
|
839
|
+
var maxTouchPoints = navigator.maxTouchPoints || 0;
|
|
840
|
+
var memory = navigator.deviceMemory || null;
|
|
841
|
+
var hardwareConcurrency = navigator.hardwareConcurrency || 1;
|
|
842
|
+
var screenInfo = {
|
|
843
|
+
width: (_screen = screen) === null || _screen === void 0 ? void 0 : _screen.width,
|
|
844
|
+
height: (_screen1 = screen) === null || _screen1 === void 0 ? void 0 : _screen1.height,
|
|
845
|
+
availWidth: (_screen2 = screen) === null || _screen2 === void 0 ? void 0 : _screen2.availWidth,
|
|
846
|
+
availHeight: (_screen3 = screen) === null || _screen3 === void 0 ? void 0 : _screen3.availHeight,
|
|
847
|
+
orientation: ((_screen4 = screen) === null || _screen4 === void 0 ? void 0 : (_screen_orientation = _screen4.orientation) === null || _screen_orientation === void 0 ? void 0 : _screen_orientation.type) || "",
|
|
848
|
+
pixelDepth: (_screen5 = screen) === null || _screen5 === void 0 ? void 0 : _screen5.pixelDepth
|
|
849
|
+
};
|
|
850
|
+
var deviceType = "desktop";
|
|
851
|
+
var brand = "Unknown";
|
|
852
|
+
var os = "Unknown";
|
|
853
|
+
var model = "";
|
|
854
|
+
var isSmartTV = false;
|
|
855
|
+
var isAndroid = false;
|
|
856
|
+
var isWebView = false;
|
|
857
|
+
var isWebApp = false;
|
|
858
|
+
if (ua.includes("Web0S")) {
|
|
859
|
+
brand = "LG";
|
|
860
|
+
os = "webOS";
|
|
861
|
+
isSmartTV = true;
|
|
862
|
+
deviceType = "tv";
|
|
863
|
+
var webosMatch = ua.match(/Web0S\/([^\s]+)/);
|
|
864
|
+
model = webosMatch ? "webOS ".concat(webosMatch[1]) : "webOS TV";
|
|
865
|
+
} else if (ua.includes("Tizen")) {
|
|
866
|
+
brand = "Samsung";
|
|
867
|
+
os = "Tizen";
|
|
868
|
+
isSmartTV = true;
|
|
869
|
+
deviceType = "tv";
|
|
870
|
+
var tizenMatch = ua.match(/Tizen\/([^\s]+)/);
|
|
871
|
+
var tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? "Smart TV" : "";
|
|
872
|
+
model = tizenMatch ? "Tizen ".concat(tizenMatch[1], " ").concat(tvMatch).trim() : "Tizen TV";
|
|
873
|
+
} else if (ua.includes("Philips")) {
|
|
874
|
+
brand = "Philips";
|
|
875
|
+
os = "Saphi";
|
|
876
|
+
isSmartTV = true;
|
|
877
|
+
deviceType = "tv";
|
|
878
|
+
} else if (ua.includes("Sharp") || ua.includes("AQUOS")) {
|
|
879
|
+
brand = "Sharp";
|
|
880
|
+
os = "Android TV";
|
|
881
|
+
isSmartTV = true;
|
|
882
|
+
deviceType = "tv";
|
|
883
|
+
} else if (ua.includes("Android") && (ua.includes("Sony") || vendor.includes("Sony"))) {
|
|
884
|
+
brand = "Sony";
|
|
885
|
+
os = "Android TV";
|
|
886
|
+
isSmartTV = true;
|
|
887
|
+
deviceType = "tv";
|
|
888
|
+
} else if (ua.includes("Android") && (ua.includes("NetCast") || ua.includes("LG"))) {
|
|
889
|
+
brand = "LG";
|
|
890
|
+
os = "Android TV";
|
|
891
|
+
isSmartTV = true;
|
|
892
|
+
deviceType = "tv";
|
|
893
|
+
} else if (ua.includes(" Roku") || ua.includes("Roku/")) {
|
|
894
|
+
brand = "Roku";
|
|
895
|
+
os = "Roku OS";
|
|
896
|
+
isSmartTV = true;
|
|
897
|
+
deviceType = "tv";
|
|
898
|
+
} else if (ua.includes("AppleTV")) {
|
|
899
|
+
brand = "Apple";
|
|
900
|
+
os = "tvOS";
|
|
901
|
+
isSmartTV = true;
|
|
902
|
+
deviceType = "tv";
|
|
903
|
+
}
|
|
904
|
+
if (ua.includes("Android")) {
|
|
905
|
+
isAndroid = true;
|
|
906
|
+
os = "Android";
|
|
907
|
+
deviceType = /Mobile/.test(ua) ? "mobile" : "tablet";
|
|
908
|
+
if (ua.includes("Android") && (maxTouchPoints === 0 || ua.includes("Google TV") || ua.includes("XiaoMi"))) {
|
|
909
|
+
deviceType = "tv";
|
|
910
|
+
isSmartTV = true;
|
|
911
|
+
brand = brand === "Unknown" ? "Android TV" : brand;
|
|
912
|
+
}
|
|
913
|
+
var androidModelMatch = ua.match(/\(([^)]*Android[^)]*)\)/);
|
|
914
|
+
if (androidModelMatch && androidModelMatch[1]) {
|
|
915
|
+
model = androidModelMatch[1];
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
if (/iPad|iPhone|iPod/.test(ua)) {
|
|
919
|
+
os = "iOS";
|
|
920
|
+
deviceType = "mobile";
|
|
921
|
+
brand = "Apple";
|
|
922
|
+
if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {
|
|
923
|
+
deviceType = "tablet";
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {
|
|
927
|
+
if (ua.includes("Windows")) {
|
|
928
|
+
os = "Windows";
|
|
929
|
+
deviceType = "desktop";
|
|
930
|
+
} else if (ua.includes("Mac") && !/iPhone/.test(ua)) {
|
|
931
|
+
os = "macOS";
|
|
932
|
+
deviceType = "desktop";
|
|
933
|
+
if (maxTouchPoints > 1) deviceType = "tablet";
|
|
934
|
+
} else if (ua.includes("Linux")) {
|
|
935
|
+
os = "Linux";
|
|
936
|
+
deviceType = "desktop";
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
if (brand === "Unknown") {
|
|
940
|
+
if (vendor.includes("Google") || ua.includes("Chrome")) brand = "Google";
|
|
941
|
+
if (vendor.includes("Apple")) brand = "Apple";
|
|
942
|
+
if (vendor.includes("Samsung") || ua.includes("SM-")) brand = "Samsung";
|
|
943
|
+
}
|
|
944
|
+
isWebView = /wv|WebView|Linux; U;/.test(ua);
|
|
945
|
+
if (((_window = window) === null || _window === void 0 ? void 0 : _window.outerHeight) === 0 && ((_window1 = window) === null || _window1 === void 0 ? void 0 : _window1.outerWidth) === 0) {
|
|
946
|
+
isWebView = true;
|
|
947
|
+
}
|
|
948
|
+
isWebApp = window.matchMedia("(display-mode: standalone)").matches || window.navigator.standalone === true || ((_window_screen = window.screen) === null || _window_screen === void 0 ? void 0 : (_window_screen_orientation = _window_screen.orientation) === null || _window_screen_orientation === void 0 ? void 0 : _window_screen_orientation.angle) !== void 0;
|
|
949
|
+
return {
|
|
950
|
+
brand: brand,
|
|
951
|
+
os: os,
|
|
952
|
+
model: model || ua.substring(0, 50) + "...",
|
|
953
|
+
deviceType: deviceType,
|
|
954
|
+
isSmartTV: isSmartTV,
|
|
955
|
+
isAndroid: isAndroid,
|
|
956
|
+
isWebView: isWebView,
|
|
957
|
+
isWebApp: isWebApp,
|
|
958
|
+
domain: window.location.hostname,
|
|
959
|
+
origin: window.location.origin,
|
|
960
|
+
path: window.location.pathname,
|
|
961
|
+
userAgent: ua,
|
|
962
|
+
vendor: vendor,
|
|
963
|
+
platform: platform,
|
|
964
|
+
screen: screenInfo,
|
|
965
|
+
hardwareConcurrency: hardwareConcurrency,
|
|
966
|
+
deviceMemory: memory,
|
|
967
|
+
maxTouchPoints: maxTouchPoints,
|
|
968
|
+
language: navigator.language,
|
|
969
|
+
languages: ((_navigator_languages = navigator.languages) === null || _navigator_languages === void 0 ? void 0 : _navigator_languages.join(",")) || "",
|
|
970
|
+
cookieEnabled: navigator.cookieEnabled,
|
|
971
|
+
doNotTrack: navigator.doNotTrack || "",
|
|
972
|
+
referrer: document.referrer,
|
|
973
|
+
visibilityState: document.visibilityState
|
|
974
|
+
};
|
|
975
|
+
}
|
|
976
|
+
function getBrowserID(clientInfo) {
|
|
977
|
+
return _async_to_generator(function() {
|
|
978
|
+
var _crypto_subtle, fingerprintString, encodedData, utf8, buffer, i, hashBuffer, hashHex, unused, hash, i1, char, fallbackHash, timestamp, random;
|
|
979
|
+
return _ts_generator(this, function(_state) {
|
|
980
|
+
switch(_state.label){
|
|
981
|
+
case 0:
|
|
982
|
+
if (cachedBrowserId) {
|
|
983
|
+
return [
|
|
984
|
+
2,
|
|
985
|
+
cachedBrowserId
|
|
986
|
+
];
|
|
987
|
+
}
|
|
988
|
+
fingerprintString = JSON.stringify(clientInfo);
|
|
989
|
+
if (!(typeof crypto !== "undefined" && ((_crypto_subtle = crypto.subtle) === null || _crypto_subtle === void 0 ? void 0 : _crypto_subtle.digest))) return [
|
|
990
|
+
3,
|
|
991
|
+
5
|
|
992
|
+
];
|
|
993
|
+
_state.label = 1;
|
|
994
|
+
case 1:
|
|
995
|
+
_state.trys.push([
|
|
996
|
+
1,
|
|
997
|
+
4,
|
|
998
|
+
,
|
|
999
|
+
5
|
|
1000
|
+
]);
|
|
1001
|
+
return [
|
|
1002
|
+
4,
|
|
1003
|
+
crypto.subtle.digest("SHA-256", new Uint8Array([
|
|
1004
|
+
1,
|
|
1005
|
+
2,
|
|
1006
|
+
3
|
|
1007
|
+
]))
|
|
1008
|
+
];
|
|
1009
|
+
case 2:
|
|
1010
|
+
_state.sent();
|
|
1011
|
+
if (typeof TextEncoder !== "undefined") {
|
|
1012
|
+
encodedData = new TextEncoder().encode(fingerprintString);
|
|
1013
|
+
} else {
|
|
1014
|
+
utf8 = unescape(encodeURIComponent(fingerprintString));
|
|
1015
|
+
buffer = new Uint8Array(utf8.length);
|
|
1016
|
+
for(i = 0; i < utf8.length; i++){
|
|
1017
|
+
buffer[i] = utf8.charCodeAt(i);
|
|
1018
|
+
}
|
|
1019
|
+
encodedData = buffer;
|
|
1020
|
+
}
|
|
1021
|
+
return [
|
|
1022
|
+
4,
|
|
1023
|
+
crypto.subtle.digest("SHA-256", encodedData)
|
|
1024
|
+
];
|
|
1025
|
+
case 3:
|
|
1026
|
+
hashBuffer = _state.sent();
|
|
1027
|
+
hashHex = Array.from(new Uint8Array(hashBuffer)).map(function(b) {
|
|
1028
|
+
return b.toString(16).padStart(2, "0");
|
|
1029
|
+
}).join("");
|
|
1030
|
+
cachedBrowserId = hashHex;
|
|
1031
|
+
return [
|
|
1032
|
+
2,
|
|
1033
|
+
hashHex
|
|
1034
|
+
];
|
|
1035
|
+
case 4:
|
|
1036
|
+
unused = _state.sent();
|
|
1037
|
+
console.warn("[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash");
|
|
1038
|
+
return [
|
|
1039
|
+
3,
|
|
1040
|
+
5
|
|
1041
|
+
];
|
|
1042
|
+
case 5:
|
|
1043
|
+
hash = 0;
|
|
1044
|
+
for(i1 = 0; i1 < fingerprintString.length; i1++){
|
|
1045
|
+
char = fingerprintString.charCodeAt(i1);
|
|
1046
|
+
hash = (hash << 5) - hash + char;
|
|
1047
|
+
hash = hash & hash;
|
|
1048
|
+
}
|
|
1049
|
+
fallbackHash = Math.abs(hash).toString(16).padStart(8, "0");
|
|
1050
|
+
timestamp = Date.now().toString(16).padStart(12, "0");
|
|
1051
|
+
random = Math.random().toString(16).substring(2, 14).padStart(12, "0");
|
|
1052
|
+
cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, "0");
|
|
1053
|
+
return [
|
|
1054
|
+
2,
|
|
1055
|
+
cachedBrowserId
|
|
1056
|
+
];
|
|
1057
|
+
}
|
|
1058
|
+
});
|
|
1059
|
+
})();
|
|
1060
|
+
}
|
|
1061
|
+
function canPublish(licenseKey) {
|
|
1062
|
+
return Boolean(isMQTTEnabled() && licenseKey);
|
|
1063
|
+
}
|
|
1064
|
+
function buildPlayerMetricEvent() {
|
|
1065
|
+
return _async_to_generator(function() {
|
|
1066
|
+
var context, flags, _flags_captureAt, _flags_adLoaded, _flags_adDetect, clientInfo, playerId, captureAt;
|
|
1067
|
+
var _arguments = arguments;
|
|
1068
|
+
return _ts_generator(this, function(_state) {
|
|
1069
|
+
switch(_state.label){
|
|
1070
|
+
case 0:
|
|
1071
|
+
context = _arguments.length > 0 && _arguments[0] !== void 0 ? _arguments[0] : {}, flags = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
|
|
1072
|
+
clientInfo = getClientInfo();
|
|
1073
|
+
return [
|
|
1074
|
+
4,
|
|
1075
|
+
getBrowserID(clientInfo)
|
|
1076
|
+
];
|
|
1077
|
+
case 1:
|
|
1078
|
+
playerId = _state.sent();
|
|
1079
|
+
captureAt = (_flags_captureAt = flags.captureAt) !== null && _flags_captureAt !== void 0 ? _flags_captureAt : /* @__PURE__ */ new Date().toISOString();
|
|
1080
|
+
return [
|
|
1081
|
+
2,
|
|
1082
|
+
_object_spread({
|
|
1083
|
+
player_id: playerId,
|
|
1084
|
+
device_type: clientInfo.deviceType,
|
|
1085
|
+
os: clientInfo.os.toLowerCase(),
|
|
1086
|
+
ad_loaded: (_flags_adLoaded = flags.adLoaded) !== null && _flags_adLoaded !== void 0 ? _flags_adLoaded : false,
|
|
1087
|
+
ad_detect: (_flags_adDetect = flags.adDetect) !== null && _flags_adDetect !== void 0 ? _flags_adDetect : false,
|
|
1088
|
+
capture_at: captureAt
|
|
1089
|
+
}, context.inputStreamType ? {
|
|
1090
|
+
input_stream_type: context.inputStreamType
|
|
1091
|
+
} : {})
|
|
1092
|
+
];
|
|
1093
|
+
}
|
|
1094
|
+
});
|
|
1095
|
+
}).apply(this, arguments);
|
|
1096
|
+
}
|
|
1097
|
+
function publishTracking(licenseKey, channel, body) {
|
|
1098
|
+
ensureMQTTClient();
|
|
1099
|
+
publishMQTT(buildPlayerTopic(licenseKey, channel), body);
|
|
1100
|
+
}
|
|
1101
|
+
function sendInitialTracking(_0) {
|
|
1102
|
+
return _async_to_generator(function(licenseKey) {
|
|
1103
|
+
var context, metricEvent, error;
|
|
1104
|
+
var _arguments = arguments;
|
|
1105
|
+
return _ts_generator(this, function(_state) {
|
|
1106
|
+
switch(_state.label){
|
|
1107
|
+
case 0:
|
|
1108
|
+
context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
|
|
1109
|
+
if (!canPublish(licenseKey)) return [
|
|
1110
|
+
2
|
|
1111
|
+
];
|
|
1112
|
+
_state.label = 1;
|
|
1113
|
+
case 1:
|
|
1114
|
+
_state.trys.push([
|
|
1115
|
+
1,
|
|
1116
|
+
3,
|
|
1117
|
+
,
|
|
1118
|
+
4
|
|
1119
|
+
]);
|
|
1120
|
+
return [
|
|
1121
|
+
4,
|
|
1122
|
+
buildPlayerMetricEvent(context, {
|
|
1123
|
+
adLoaded: false,
|
|
1124
|
+
adDetect: false
|
|
1125
|
+
})
|
|
1126
|
+
];
|
|
1127
|
+
case 2:
|
|
1128
|
+
metricEvent = _state.sent();
|
|
1129
|
+
publishTracking(licenseKey, "metrics", {
|
|
1130
|
+
events: [
|
|
1131
|
+
metricEvent
|
|
1132
|
+
]
|
|
1133
|
+
});
|
|
1134
|
+
return [
|
|
1135
|
+
3,
|
|
1136
|
+
4
|
|
1137
|
+
];
|
|
1138
|
+
case 3:
|
|
1139
|
+
error = _state.sent();
|
|
1140
|
+
console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
|
|
1141
|
+
return [
|
|
1142
|
+
3,
|
|
1143
|
+
4
|
|
1144
|
+
];
|
|
1145
|
+
case 4:
|
|
1146
|
+
return [
|
|
1147
|
+
2
|
|
1148
|
+
];
|
|
1149
|
+
}
|
|
1150
|
+
});
|
|
1151
|
+
}).apply(this, arguments);
|
|
1152
|
+
}
|
|
1153
|
+
function sendHeartbeat(_0) {
|
|
1154
|
+
return _async_to_generator(function(licenseKey) {
|
|
1155
|
+
var context, flags, heartbeatData, error;
|
|
1156
|
+
var _arguments = arguments;
|
|
1157
|
+
return _ts_generator(this, function(_state) {
|
|
1158
|
+
switch(_state.label){
|
|
1159
|
+
case 0:
|
|
1160
|
+
context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {}, flags = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
|
|
1161
|
+
if (!canPublish(licenseKey)) return [
|
|
1162
|
+
2
|
|
1163
|
+
];
|
|
1164
|
+
_state.label = 1;
|
|
1165
|
+
case 1:
|
|
1166
|
+
_state.trys.push([
|
|
1167
|
+
1,
|
|
1168
|
+
3,
|
|
1169
|
+
,
|
|
1170
|
+
4
|
|
1171
|
+
]);
|
|
1172
|
+
return [
|
|
1173
|
+
4,
|
|
1174
|
+
buildPlayerMetricEvent(context, flags)
|
|
1175
|
+
];
|
|
1176
|
+
case 2:
|
|
1177
|
+
heartbeatData = _state.sent();
|
|
1178
|
+
publishTracking(licenseKey, "heartbeat", heartbeatData);
|
|
1179
|
+
return [
|
|
1180
|
+
3,
|
|
1181
|
+
4
|
|
1182
|
+
];
|
|
1183
|
+
case 3:
|
|
1184
|
+
error = _state.sent();
|
|
1185
|
+
console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
|
|
1186
|
+
return [
|
|
1187
|
+
3,
|
|
1188
|
+
4
|
|
1189
|
+
];
|
|
1190
|
+
case 4:
|
|
1191
|
+
return [
|
|
1192
|
+
2
|
|
1193
|
+
];
|
|
1194
|
+
}
|
|
1195
|
+
});
|
|
1196
|
+
}).apply(this, arguments);
|
|
1197
|
+
}
|
|
1198
|
+
// src/player/VmapManager.ts
|
|
1199
|
+
var VmapManager = /*#__PURE__*/ function() {
|
|
1200
|
+
function VmapManager(config, video) {
|
|
1201
|
+
_class_call_check(this, VmapManager);
|
|
1202
|
+
this.vmapBreaks = [];
|
|
1203
|
+
this.consumedVmapBreakIds = /* @__PURE__ */ new Set();
|
|
1204
|
+
this.streamCorrelator = generateCorrelator();
|
|
1205
|
+
this.consentSignals = {};
|
|
1206
|
+
this.podCounter = 0;
|
|
1207
|
+
this.podAssignedByPrefetch = false;
|
|
1208
|
+
this.adRequestPositionInBreak = 0;
|
|
1209
|
+
this.lastHeartbeatTime = 0;
|
|
1210
|
+
this.config = config;
|
|
1211
|
+
this.video = video;
|
|
1212
|
+
}
|
|
1213
|
+
_create_class(VmapManager, [
|
|
1214
|
+
{
|
|
1215
|
+
key: "debug",
|
|
1216
|
+
get: function get() {
|
|
1217
|
+
return !!this.config.debugAdTiming;
|
|
1218
|
+
}
|
|
1219
|
+
},
|
|
1220
|
+
{
|
|
1221
|
+
key: "isVmapEnabled",
|
|
1222
|
+
value: function isVmapEnabled() {
|
|
1223
|
+
var _this_config_vmapUrl;
|
|
1224
|
+
return !!(this.config.isVmap && ((_this_config_vmapUrl = this.config.vmapUrl) === null || _this_config_vmapUrl === void 0 ? void 0 : _this_config_vmapUrl.trim()));
|
|
1225
|
+
}
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
key: "fetchAdConfiguration",
|
|
1229
|
+
value: function fetchAdConfiguration() {
|
|
1230
|
+
return _async_to_generator(function() {
|
|
1231
|
+
var _data_response_ima_publisherdeskima, _data_response_ima, _data_response, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response1, vastMode, vastEndpoint, apiUrl, headers, response, data, imaPayload, numberAds;
|
|
1232
|
+
return _ts_generator(this, function(_state) {
|
|
1233
|
+
switch(_state.label){
|
|
1234
|
+
case 0:
|
|
1235
|
+
if (!this.isVmapEnabled()) return [
|
|
1236
|
+
3,
|
|
1237
|
+
2
|
|
1238
|
+
];
|
|
1239
|
+
return [
|
|
1240
|
+
4,
|
|
1241
|
+
this.fetchAndParseVmap(this.config.vmapUrl)
|
|
1242
|
+
];
|
|
1243
|
+
case 1:
|
|
1244
|
+
_state.sent();
|
|
1245
|
+
if (this.debug) {
|
|
1246
|
+
console.log("[StormcloudVideoPlayer] VMAP mode enabled");
|
|
1247
|
+
}
|
|
1248
|
+
return [
|
|
1249
|
+
2
|
|
1250
|
+
];
|
|
1251
|
+
case 2:
|
|
1252
|
+
vastMode = this.config.vastMode || "default";
|
|
1253
|
+
if (this.debug) {
|
|
1254
|
+
console.log("[StormcloudVideoPlayer] VAST mode:", vastMode);
|
|
1255
|
+
}
|
|
1256
|
+
if (vastMode === "adstorm") {
|
|
1257
|
+
if (!this.config.licenseKey) {
|
|
1258
|
+
if (this.debug) {
|
|
1259
|
+
console.warn("[StormcloudVideoPlayer] AdStorm mode requires a license key");
|
|
1260
|
+
}
|
|
1261
|
+
return [
|
|
1262
|
+
2
|
|
1263
|
+
];
|
|
1264
|
+
}
|
|
1265
|
+
vastEndpoint = "https://adstorm.co/api-adstorm-dev/adstorm/vast/".concat(this.config.licenseKey);
|
|
1266
|
+
this.apiVastTagUrl = vastEndpoint;
|
|
1267
|
+
if (this.debug) {
|
|
1268
|
+
console.log("[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):", vastEndpoint);
|
|
1269
|
+
}
|
|
1270
|
+
return [
|
|
1271
|
+
2
|
|
1272
|
+
];
|
|
1273
|
+
}
|
|
1274
|
+
if (this.config.vastTagUrl) {
|
|
1275
|
+
this.apiVastTagUrl = this.config.vastTagUrl;
|
|
1276
|
+
if (this.debug) {
|
|
1277
|
+
console.log("[StormcloudVideoPlayer] Using custom VAST tag URL:", this.apiVastTagUrl);
|
|
1278
|
+
}
|
|
1279
|
+
return [
|
|
1280
|
+
2
|
|
1281
|
+
];
|
|
1282
|
+
}
|
|
1283
|
+
apiUrl = "https://adstorm.co/api-adstorm-dev/adstorm/ads/web";
|
|
1284
|
+
if (this.debug) {
|
|
1285
|
+
console.log("[StormcloudVideoPlayer] Fetching ad configuration from:", apiUrl);
|
|
1286
|
+
}
|
|
1287
|
+
headers = {};
|
|
1288
|
+
if (this.config.licenseKey) {
|
|
1289
|
+
headers["Authorization"] = "Bearer ".concat(this.config.licenseKey);
|
|
1290
|
+
}
|
|
1291
|
+
return [
|
|
1292
|
+
4,
|
|
1293
|
+
fetch(apiUrl, {
|
|
1294
|
+
headers: headers
|
|
1295
|
+
})
|
|
1296
|
+
];
|
|
1297
|
+
case 3:
|
|
1298
|
+
response = _state.sent();
|
|
1299
|
+
if (!response.ok) {
|
|
1300
|
+
if (this.debug) {
|
|
1301
|
+
console.warn("[StormcloudVideoPlayer] Failed to fetch ad configuration: ".concat(response.status));
|
|
1302
|
+
}
|
|
1303
|
+
return [
|
|
1304
|
+
2
|
|
1305
|
+
];
|
|
1306
|
+
}
|
|
1307
|
+
return [
|
|
1308
|
+
4,
|
|
1309
|
+
response.json()
|
|
1310
|
+
];
|
|
1311
|
+
case 4:
|
|
1312
|
+
data = _state.sent();
|
|
1313
|
+
imaPayload = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : (_data_response_ima = _data_response.ima) === null || _data_response_ima === void 0 ? void 0 : (_data_response_ima_publisherdeskima = _data_response_ima["publisherdesk.ima"]) === null || _data_response_ima_publisherdeskima === void 0 ? void 0 : _data_response_ima_publisherdeskima.payload;
|
|
1314
|
+
if (imaPayload) {
|
|
1315
|
+
this.apiVastTagUrl = decodeURIComponent(imaPayload);
|
|
1316
|
+
if (this.debug) {
|
|
1317
|
+
console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
|
|
1318
|
+
}
|
|
1319
|
+
} else {
|
|
1320
|
+
if (this.debug) {
|
|
1321
|
+
console.warn("[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response");
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
numberAds = (_data_response1 = data.response) === null || _data_response1 === void 0 ? void 0 : (_data_response_options = _data_response1.options) === null || _data_response_options === void 0 ? void 0 : (_data_response_options_vast = _data_response_options.vast) === null || _data_response_options_vast === void 0 ? void 0 : (_data_response_options_vast_cue_tones = _data_response_options_vast.cue_tones) === null || _data_response_options_vast_cue_tones === void 0 ? void 0 : _data_response_options_vast_cue_tones.number_ads;
|
|
1325
|
+
if (numberAds != null && numberAds > 0) {
|
|
1326
|
+
this.apiNumberAds = numberAds;
|
|
1327
|
+
if (this.debug) {
|
|
1328
|
+
console.log("[StormcloudVideoPlayer] Number of ads per break from API:", this.apiNumberAds);
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
return [
|
|
1332
|
+
2
|
|
1333
|
+
];
|
|
1334
|
+
}
|
|
1335
|
+
});
|
|
1336
|
+
}).call(this);
|
|
1337
|
+
}
|
|
1338
|
+
},
|
|
1339
|
+
{
|
|
1340
|
+
key: "fetchAndParseVmap",
|
|
1341
|
+
value: function fetchAndParseVmap(vmapUrl) {
|
|
1342
|
+
return _async_to_generator(function() {
|
|
1343
|
+
var response, vmapXml, error;
|
|
1344
|
+
return _ts_generator(this, function(_state) {
|
|
1345
|
+
switch(_state.label){
|
|
1346
|
+
case 0:
|
|
1347
|
+
if (!vmapUrl.trim()) {
|
|
1348
|
+
return [
|
|
1349
|
+
2
|
|
1350
|
+
];
|
|
1351
|
+
}
|
|
1352
|
+
_state.label = 1;
|
|
1353
|
+
case 1:
|
|
1354
|
+
_state.trys.push([
|
|
1355
|
+
1,
|
|
1356
|
+
4,
|
|
1357
|
+
,
|
|
1358
|
+
5
|
|
1359
|
+
]);
|
|
1360
|
+
return [
|
|
1361
|
+
4,
|
|
1362
|
+
fetch(vmapUrl)
|
|
1363
|
+
];
|
|
1364
|
+
case 2:
|
|
1365
|
+
response = _state.sent();
|
|
1366
|
+
if (!response.ok) {
|
|
1367
|
+
throw new Error("Failed to fetch VMAP (".concat(response.status, ")"));
|
|
1368
|
+
}
|
|
1369
|
+
return [
|
|
1370
|
+
4,
|
|
1371
|
+
response.text()
|
|
1372
|
+
];
|
|
1373
|
+
case 3:
|
|
1374
|
+
vmapXml = _state.sent();
|
|
1375
|
+
this.vmapBreaks = this.parseVmapToBreaks(vmapXml);
|
|
1376
|
+
this.consumedVmapBreakIds.clear();
|
|
1377
|
+
if (this.debug) {
|
|
1378
|
+
console.log("[StormcloudVideoPlayer] Loaded ".concat(this.vmapBreaks.length, " VMAP ad break(s) from:"), vmapUrl);
|
|
1379
|
+
}
|
|
1380
|
+
return [
|
|
1381
|
+
3,
|
|
1382
|
+
5
|
|
1383
|
+
];
|
|
1384
|
+
case 4:
|
|
1385
|
+
error = _state.sent();
|
|
1386
|
+
this.vmapBreaks = [];
|
|
1387
|
+
this.consumedVmapBreakIds.clear();
|
|
1388
|
+
if (this.debug) {
|
|
1389
|
+
console.warn("[StormcloudVideoPlayer] Failed to load VMAP:", error);
|
|
1390
|
+
}
|
|
1391
|
+
return [
|
|
1392
|
+
3,
|
|
1393
|
+
5
|
|
1394
|
+
];
|
|
1395
|
+
case 5:
|
|
1396
|
+
return [
|
|
1397
|
+
2
|
|
1398
|
+
];
|
|
1399
|
+
}
|
|
1400
|
+
});
|
|
1401
|
+
}).call(this);
|
|
1402
|
+
}
|
|
1403
|
+
},
|
|
1404
|
+
{
|
|
1405
|
+
key: "parseVmapToBreaks",
|
|
1406
|
+
value: function parseVmapToBreaks(vmapXml) {
|
|
1407
|
+
var _this = this;
|
|
1408
|
+
if (typeof DOMParser === "undefined") {
|
|
1409
|
+
return [];
|
|
1410
|
+
}
|
|
1411
|
+
var doc = new DOMParser().parseFromString(vmapXml, "application/xml");
|
|
1412
|
+
if (doc.querySelector("parsererror")) {
|
|
1413
|
+
if (this.debug) {
|
|
1414
|
+
console.warn("[StormcloudVideoPlayer] Invalid VMAP XML received");
|
|
1415
|
+
}
|
|
1416
|
+
return [];
|
|
1417
|
+
}
|
|
1418
|
+
var VMAP_NS = "http://www.iab.net/videosuite/vmap";
|
|
1419
|
+
var adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, "AdBreak"));
|
|
1420
|
+
if (adBreakNodes.length === 0) {
|
|
1421
|
+
adBreakNodes = Array.from(doc.querySelectorAll("AdBreak, vmap\\:AdBreak"));
|
|
1422
|
+
}
|
|
1423
|
+
if (adBreakNodes.length === 0) {
|
|
1424
|
+
adBreakNodes = Array.from(doc.getElementsByTagName("*")).filter(function(el) {
|
|
1425
|
+
return el.localName === "AdBreak";
|
|
1426
|
+
});
|
|
1427
|
+
}
|
|
1428
|
+
var parsed = [];
|
|
1429
|
+
adBreakNodes.forEach(function(node, index) {
|
|
1430
|
+
var timeOffsetRaw = (node.getAttribute("timeOffset") || "").trim();
|
|
1431
|
+
var startTimeMs = _this.parseVmapTimeOffsetToMs(timeOffsetRaw);
|
|
1432
|
+
if (startTimeMs == null) {
|
|
1433
|
+
return;
|
|
1434
|
+
}
|
|
1435
|
+
var adTagNode = node.getElementsByTagNameNS(VMAP_NS, "AdTagURI")[0];
|
|
1436
|
+
if (!adTagNode) {
|
|
1437
|
+
var _node_querySelector;
|
|
1438
|
+
adTagNode = (_node_querySelector = node.querySelector("AdTagURI, vmap\\:AdTagURI")) !== null && _node_querySelector !== void 0 ? _node_querySelector : void 0;
|
|
1439
|
+
}
|
|
1440
|
+
var adTagUrl = ((adTagNode === null || adTagNode === void 0 ? void 0 : adTagNode.textContent) || "").trim();
|
|
1441
|
+
if (!adTagUrl) {
|
|
1442
|
+
return;
|
|
1443
|
+
}
|
|
1444
|
+
var breakId = node.getAttribute("breakId") || "vmap-break-".concat(index, "-").concat(timeOffsetRaw || "unknown");
|
|
1445
|
+
parsed.push({
|
|
1446
|
+
id: breakId,
|
|
1447
|
+
startTimeMs: startTimeMs,
|
|
1448
|
+
vastTagUrl: adTagUrl
|
|
1449
|
+
});
|
|
1450
|
+
});
|
|
1451
|
+
parsed.sort(function(a, b) {
|
|
1452
|
+
var aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;
|
|
1453
|
+
var bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;
|
|
1454
|
+
return aStart - bStart;
|
|
1455
|
+
});
|
|
1456
|
+
return parsed;
|
|
1457
|
+
}
|
|
1458
|
+
},
|
|
1459
|
+
{
|
|
1460
|
+
key: "parseVmapTimeOffsetToMs",
|
|
1461
|
+
value: function parseVmapTimeOffsetToMs(timeOffset) {
|
|
1462
|
+
if (!timeOffset) {
|
|
1463
|
+
return void 0;
|
|
1464
|
+
}
|
|
1465
|
+
var normalized = timeOffset.trim().toLowerCase();
|
|
1466
|
+
if (normalized === "start") {
|
|
1467
|
+
return 0;
|
|
1468
|
+
}
|
|
1469
|
+
if (normalized === "end") {
|
|
1470
|
+
return -1;
|
|
1471
|
+
}
|
|
1472
|
+
var hms = timeOffset.match(/^(\d{1,2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?$/);
|
|
1473
|
+
if (hms) {
|
|
1474
|
+
var _hms = _sliced_to_array(hms, 5), hh = _hms[1], mm = _hms[2], ss = _hms[3], tmp = _hms[4], ms = tmp === void 0 ? "0" : tmp;
|
|
1475
|
+
var hours = Number(hh);
|
|
1476
|
+
var minutes = Number(mm);
|
|
1477
|
+
var seconds = Number(ss);
|
|
1478
|
+
var millis = Number(ms.padEnd(3, "0").slice(0, 3));
|
|
1479
|
+
return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;
|
|
1480
|
+
}
|
|
1481
|
+
var percent = timeOffset.match(/^(\d+(?:\.\d+)?)%$/);
|
|
1482
|
+
if (percent) {
|
|
1483
|
+
var ratio = Number(percent[1]) / 100;
|
|
1484
|
+
var durationSec = this.video.duration;
|
|
1485
|
+
if (Number.isFinite(durationSec) && durationSec > 0) {
|
|
1486
|
+
return Math.floor(durationSec * 1e3 * ratio);
|
|
1487
|
+
}
|
|
1488
|
+
return void 0;
|
|
1489
|
+
}
|
|
1490
|
+
return void 0;
|
|
1491
|
+
}
|
|
1492
|
+
},
|
|
1493
|
+
{
|
|
1494
|
+
key: "getAdBreakKey",
|
|
1495
|
+
value: function getAdBreakKey(adBreak) {
|
|
1496
|
+
if (adBreak.id) {
|
|
1497
|
+
return adBreak.id;
|
|
1498
|
+
}
|
|
1499
|
+
return "".concat(adBreak.startTimeMs, "-").concat(adBreak.vastTagUrl || "");
|
|
1500
|
+
}
|
|
1501
|
+
},
|
|
1502
|
+
{
|
|
1503
|
+
key: "resolveBreakStartMs",
|
|
1504
|
+
value: function resolveBreakStartMs(adBreak) {
|
|
1505
|
+
if (adBreak.startTimeMs >= 0) {
|
|
1506
|
+
return adBreak.startTimeMs;
|
|
1507
|
+
}
|
|
1508
|
+
if (adBreak.startTimeMs === -1) {
|
|
1509
|
+
var durationSec = this.video.duration;
|
|
1510
|
+
if (Number.isFinite(durationSec) && durationSec > 0) {
|
|
1511
|
+
return Math.floor(durationSec * 1e3);
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
return void 0;
|
|
1515
|
+
}
|
|
1516
|
+
},
|
|
1517
|
+
{
|
|
1518
|
+
key: "findCurrentOrNextBreak",
|
|
1519
|
+
value: function findCurrentOrNextBreak(nowMs) {
|
|
1520
|
+
var _this_config_driftToleranceMs;
|
|
1521
|
+
var schedule = this.vmapBreaks;
|
|
1522
|
+
var candidate;
|
|
1523
|
+
var tol = (_this_config_driftToleranceMs = this.config.driftToleranceMs) !== null && _this_config_driftToleranceMs !== void 0 ? _this_config_driftToleranceMs : 1e3;
|
|
1524
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1525
|
+
try {
|
|
1526
|
+
for(var _iterator = schedule[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1527
|
+
var b = _step.value;
|
|
1528
|
+
var _this_resolveBreakStartMs;
|
|
1529
|
+
if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {
|
|
1530
|
+
continue;
|
|
1531
|
+
}
|
|
1532
|
+
var breakStartMs = this.resolveBreakStartMs(b);
|
|
1533
|
+
if (breakStartMs == null) {
|
|
1534
|
+
continue;
|
|
1535
|
+
}
|
|
1536
|
+
if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > ((_this_resolveBreakStartMs = this.resolveBreakStartMs(candidate)) !== null && _this_resolveBreakStartMs !== void 0 ? _this_resolveBreakStartMs : 0))) {
|
|
1537
|
+
candidate = b;
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
} catch (err) {
|
|
1541
|
+
_didIteratorError = true;
|
|
1542
|
+
_iteratorError = err;
|
|
1543
|
+
} finally{
|
|
1544
|
+
try {
|
|
1545
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1546
|
+
_iterator.return();
|
|
1547
|
+
}
|
|
1548
|
+
} finally{
|
|
1549
|
+
if (_didIteratorError) {
|
|
1550
|
+
throw _iteratorError;
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
}
|
|
1554
|
+
return candidate;
|
|
1555
|
+
}
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
key: "findBreakForTime",
|
|
1559
|
+
value: function findBreakForTime(nowMs) {
|
|
1560
|
+
var schedule = this.vmapBreaks;
|
|
1561
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
1562
|
+
try {
|
|
1563
|
+
for(var _iterator = schedule[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
1564
|
+
var b = _step.value;
|
|
1565
|
+
if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {
|
|
1566
|
+
continue;
|
|
1567
|
+
}
|
|
1568
|
+
var breakStartMs = this.resolveBreakStartMs(b);
|
|
1569
|
+
if (breakStartMs == null) {
|
|
1570
|
+
continue;
|
|
1571
|
+
}
|
|
1572
|
+
if (b.durationMs) {
|
|
1573
|
+
var end = breakStartMs + b.durationMs;
|
|
1574
|
+
if (nowMs >= breakStartMs && nowMs < end) {
|
|
1575
|
+
return b;
|
|
1576
|
+
}
|
|
1577
|
+
continue;
|
|
1578
|
+
}
|
|
1579
|
+
if (nowMs >= breakStartMs) {
|
|
1580
|
+
return b;
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
} catch (err) {
|
|
1584
|
+
_didIteratorError = true;
|
|
1585
|
+
_iteratorError = err;
|
|
1586
|
+
} finally{
|
|
1587
|
+
try {
|
|
1588
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
1589
|
+
_iterator.return();
|
|
1590
|
+
}
|
|
1591
|
+
} finally{
|
|
1592
|
+
if (_didIteratorError) {
|
|
1593
|
+
throw _iteratorError;
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
return void 0;
|
|
1598
|
+
}
|
|
1599
|
+
},
|
|
1600
|
+
{
|
|
1601
|
+
key: "selectVastTagsForBreak",
|
|
1602
|
+
value: function selectVastTagsForBreak(b) {
|
|
1603
|
+
if (!b || !b.vastTagUrl) return void 0;
|
|
1604
|
+
if (b.vastTagUrl.includes(",")) {
|
|
1605
|
+
return b.vastTagUrl.split(",").map(function(s) {
|
|
1606
|
+
return s.trim();
|
|
1607
|
+
}).filter(function(s) {
|
|
1608
|
+
return s.length > 0;
|
|
1609
|
+
});
|
|
1610
|
+
}
|
|
1611
|
+
return [
|
|
1612
|
+
b.vastTagUrl
|
|
1613
|
+
];
|
|
1614
|
+
}
|
|
1615
|
+
},
|
|
1616
|
+
{
|
|
1617
|
+
key: "beginNewAdPod",
|
|
1618
|
+
value: function beginNewAdPod() {
|
|
1619
|
+
this.podCounter++;
|
|
1620
|
+
this.adRequestPositionInBreak = 0;
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
{
|
|
1624
|
+
key: "generateVastUrlsWithCorrelators",
|
|
1625
|
+
value: function generateVastUrlsWithCorrelators(baseUrl, count, adPlayer, palNonce, inAdBreak) {
|
|
1626
|
+
var urls = [];
|
|
1627
|
+
for(var i = 0; i < count; i++){
|
|
1628
|
+
this.adRequestPositionInBreak++;
|
|
1629
|
+
var adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;
|
|
1630
|
+
var ctvSignals = this.config.ctvAdRequest ? resolveCtvVastSignals() : void 0;
|
|
1631
|
+
var urlWithMacros = applyVastMacros(baseUrl, {
|
|
1632
|
+
correlator: generateCorrelator(),
|
|
1633
|
+
streamCorrelator: this.streamCorrelator,
|
|
1634
|
+
pod: this.podCounter > 0 ? this.podCounter : void 0,
|
|
1635
|
+
adPosition: this.adRequestPositionInBreak,
|
|
1636
|
+
isCtv: this.config.ctvAdRequest,
|
|
1637
|
+
contentUrl: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.contentUrl,
|
|
1638
|
+
pageUrl: !this.config.ctvAdRequest && typeof window !== "undefined" ? window.location.href : void 0,
|
|
1639
|
+
adWillPlayMuted: adWillPlayMuted,
|
|
1640
|
+
adWillAutoPlay: !!this.config.autoplay,
|
|
1641
|
+
appId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.appId,
|
|
1642
|
+
appName: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.appName,
|
|
1643
|
+
sessionId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.sessionId,
|
|
1644
|
+
deviceId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceId,
|
|
1645
|
+
deviceIdType: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceIdType,
|
|
1646
|
+
limitAdTracking: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.limitAdTracking,
|
|
1647
|
+
deviceTypeHint: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceTypeHint,
|
|
1648
|
+
adTest: this.config.adTest,
|
|
1649
|
+
consent: this.consentSignals
|
|
1650
|
+
});
|
|
1651
|
+
urls.push(palNonce.injectNonce(urlWithMacros));
|
|
1652
|
+
}
|
|
1653
|
+
return urls;
|
|
1654
|
+
}
|
|
1655
|
+
},
|
|
1656
|
+
{
|
|
1657
|
+
// --- Tracking ---
|
|
1658
|
+
key: "initializeTracking",
|
|
1659
|
+
value: function initializeTracking() {
|
|
1660
|
+
var _this = this;
|
|
1661
|
+
sendInitialTracking(this.config.licenseKey).then(function() {
|
|
1662
|
+
_this.heartbeatInterval = window.setInterval(function() {
|
|
1663
|
+
_this.sendHeartbeatIfNeeded();
|
|
1664
|
+
}, 5e3);
|
|
1665
|
+
}).catch(function(error) {
|
|
1666
|
+
if (_this.debug) {
|
|
1667
|
+
console.warn("[StormcloudVideoPlayer] Failed to send initial tracking:", error);
|
|
1668
|
+
}
|
|
1669
|
+
_this.heartbeatInterval = window.setInterval(function() {
|
|
1670
|
+
_this.sendHeartbeatIfNeeded();
|
|
1671
|
+
}, 5e3);
|
|
1672
|
+
});
|
|
1673
|
+
}
|
|
1674
|
+
},
|
|
1675
|
+
{
|
|
1676
|
+
key: "sendHeartbeatIfNeeded",
|
|
1677
|
+
value: function sendHeartbeatIfNeeded() {
|
|
1678
|
+
var _this = this;
|
|
1679
|
+
var now = Date.now();
|
|
1680
|
+
if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {
|
|
1681
|
+
this.lastHeartbeatTime = now;
|
|
1682
|
+
sendHeartbeat(this.config.licenseKey).catch(function(error) {
|
|
1683
|
+
if (_this.debug) {
|
|
1684
|
+
console.warn("[StormcloudVideoPlayer] Failed to send heartbeat:", error);
|
|
1685
|
+
}
|
|
1686
|
+
});
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
},
|
|
1690
|
+
{
|
|
1691
|
+
key: "destroyTracking",
|
|
1692
|
+
value: function destroyTracking() {
|
|
1693
|
+
if (this.heartbeatInterval) {
|
|
1694
|
+
clearInterval(this.heartbeatInterval);
|
|
1695
|
+
this.heartbeatInterval = void 0;
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
]);
|
|
1700
|
+
return VmapManager;
|
|
1701
|
+
}();
|
|
1702
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1703
|
+
0 && (module.exports = {
|
|
1704
|
+
VmapManager: VmapManager
|
|
1705
|
+
});
|
|
1706
|
+
//# sourceMappingURL=VmapManager.cjs.map
|