stormcloud-video-player 0.8.18 → 0.8.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -83
- package/dist/stormcloud-vp.min.js +1 -1
- package/lib/index.cjs +686 -353
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +686 -353
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +11 -11
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +4 -4
- package/lib/player/{VmapManager.cjs → AdConfigManager.cjs} +561 -217
- package/lib/player/AdConfigManager.cjs.map +1 -0
- package/lib/player/{VmapManager.d.cts → AdConfigManager.d.cts} +3 -3
- package/lib/player/AdPreloadPool.d.cts +1 -1
- package/lib/player/AdTimingService.d.cts +1 -1
- package/lib/player/HlsEngine.d.cts +1 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +686 -353
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +2 -2
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/HlsPlayer.cjs +686 -353
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +686 -353
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +5 -4
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/types-BAP8n5mE.d.cts +126 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +686 -353
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/ctvVastSignals.cjs +103 -33
- package/lib/utils/ctvVastSignals.cjs.map +1 -1
- package/lib/utils/ctvVastSignals.d.cts +1 -13
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/vastEnvironmentSignals.cjs +450 -0
- package/lib/utils/vastEnvironmentSignals.cjs.map +1 -0
- package/lib/utils/vastEnvironmentSignals.d.cts +16 -0
- package/lib/utils/vastMacros.cjs +347 -25
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/lib/utils/vastMacros.d.cts +3 -1
- package/package.json +1 -1
- package/lib/player/VmapManager.cjs.map +0 -1
package/lib/utils/vastMacros.cjs
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
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_without_holes(arr) {
|
|
8
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
9
|
+
}
|
|
10
|
+
function _iterable_to_array(iter) {
|
|
11
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
12
|
+
}
|
|
13
|
+
function _non_iterable_spread() {
|
|
14
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
15
|
+
}
|
|
16
|
+
function _to_consumable_array(arr) {
|
|
17
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
18
|
+
}
|
|
2
19
|
function _type_of(obj) {
|
|
3
20
|
"@swc/helpers - typeof";
|
|
4
21
|
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
5
22
|
}
|
|
23
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
24
|
+
if (!o) return;
|
|
25
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
26
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
27
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
28
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
29
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
30
|
+
}
|
|
6
31
|
var __defProp = Object.defineProperty;
|
|
7
32
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
8
33
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -60,24 +85,45 @@ __export(vastMacros_exports, {
|
|
|
60
85
|
},
|
|
61
86
|
generateCorrelator: function generateCorrelator1() {
|
|
62
87
|
return generateCorrelator;
|
|
88
|
+
},
|
|
89
|
+
isMacroPlaceholder: function isMacroPlaceholder1() {
|
|
90
|
+
return isMacroPlaceholder;
|
|
91
|
+
},
|
|
92
|
+
normalizeVastTagUrl: function normalizeVastTagUrl1() {
|
|
93
|
+
return normalizeVastTagUrl;
|
|
63
94
|
}
|
|
64
95
|
});
|
|
65
96
|
module.exports = __toCommonJS(vastMacros_exports);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return String(value);
|
|
75
|
-
}
|
|
76
|
-
} catch (unused) {}
|
|
97
|
+
// src/utils/vastEnvironmentSignals.ts
|
|
98
|
+
var ANDROID_ID_TYPES = /* @__PURE__ */ new Set([
|
|
99
|
+
"aaid",
|
|
100
|
+
"adid"
|
|
101
|
+
]);
|
|
102
|
+
function inferDeviceIdType() {
|
|
103
|
+
if (typeof navigator === "undefined") {
|
|
104
|
+
return void 0;
|
|
77
105
|
}
|
|
78
|
-
|
|
106
|
+
var ua = navigator.userAgent;
|
|
107
|
+
if (/Roku/i.test(ua)) return "rida";
|
|
108
|
+
if (/Tizen|Samsung/i.test(ua)) return "tifa";
|
|
109
|
+
if (/AppleTV|Apple TV/i.test(ua)) return "tvOS";
|
|
110
|
+
if (/AFT|Fire TV|Amazon/i.test(ua)) return "afai";
|
|
111
|
+
if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return "lgudid";
|
|
112
|
+
if (/Android|Google TV/i.test(ua)) return "aaid";
|
|
113
|
+
if (/iPhone|iPad|iPod/i.test(ua)) return "idfa";
|
|
114
|
+
return void 0;
|
|
115
|
+
}
|
|
116
|
+
function isEquivalentDeviceIdType(tagType, runtimeType) {
|
|
117
|
+
if (!tagType || !runtimeType) return false;
|
|
118
|
+
var tag = tagType.toLowerCase();
|
|
119
|
+
var runtime = runtimeType.toLowerCase();
|
|
120
|
+
if (tag === runtime) return true;
|
|
121
|
+
return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);
|
|
79
122
|
}
|
|
123
|
+
// src/utils/vastMacros.ts
|
|
80
124
|
var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
|
|
125
|
+
var INVALID_VAST_PARAM_KEY = /^\s|\s$/;
|
|
126
|
+
var EXAMPLE_COM_URL = /example\.com/i;
|
|
81
127
|
var CTV_UNSUPPORTED_PARAMS = [
|
|
82
128
|
"description_url",
|
|
83
129
|
"tfcd",
|
|
@@ -92,14 +138,288 @@ var CTV_UNSUPPORTED_PARAMS = [
|
|
|
92
138
|
"gdpr_consent",
|
|
93
139
|
"us_privacy"
|
|
94
140
|
];
|
|
141
|
+
var INLINE_DEVICE_MACRO_REPLACEMENTS = [
|
|
142
|
+
{
|
|
143
|
+
pattern: /\[RDID\]/gi,
|
|
144
|
+
getValue: function getValue(ctx) {
|
|
145
|
+
return ctx.deviceId;
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
pattern: /\[IFA\]/gi,
|
|
150
|
+
getValue: function getValue(ctx) {
|
|
151
|
+
return ctx.deviceId;
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
pattern: /\[ADVERTISING[_-]?ID(?:ENTIFIER)?\]/gi,
|
|
156
|
+
getValue: function getValue(ctx) {
|
|
157
|
+
return ctx.deviceId;
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
pattern: /\[DEVICE[_-]?ID\]/gi,
|
|
162
|
+
getValue: function getValue(ctx) {
|
|
163
|
+
return ctx.deviceId;
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
pattern: /\[IDTYPE\]/gi,
|
|
168
|
+
getValue: function getValue(ctx) {
|
|
169
|
+
return ctx.deviceIdType;
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
pattern: /\{rdid\}/gi,
|
|
174
|
+
getValue: function getValue(ctx) {
|
|
175
|
+
return ctx.deviceId;
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
pattern: /\{device[_-]?id\}/gi,
|
|
180
|
+
getValue: function getValue(ctx) {
|
|
181
|
+
return ctx.deviceId;
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
pattern: /\{idtype\}/gi,
|
|
186
|
+
getValue: function getValue(ctx) {
|
|
187
|
+
return ctx.deviceIdType;
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi,
|
|
192
|
+
getValue: function getValue(ctx) {
|
|
193
|
+
return ctx.deviceId;
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi,
|
|
198
|
+
getValue: function getValue(ctx) {
|
|
199
|
+
return ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
pattern: /%%ADVERTISING_ID_TYPE%%/gi,
|
|
204
|
+
getValue: function getValue(ctx) {
|
|
205
|
+
return ctx.deviceIdType;
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
pattern: /%%ADVERTISING_ID%%/gi,
|
|
210
|
+
getValue: function getValue(ctx) {
|
|
211
|
+
return ctx.deviceId;
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
pattern: /%%LIMIT_AD_TRACKING%%/gi,
|
|
216
|
+
getValue: function getValue(ctx) {
|
|
217
|
+
return ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
pattern: /%%MSID%%/gi,
|
|
222
|
+
getValue: function getValue(ctx) {
|
|
223
|
+
return ctx.appId;
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
pattern: /%%APP_NAME%%/gi,
|
|
228
|
+
getValue: function getValue(ctx) {
|
|
229
|
+
return ctx.appName;
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
pattern: /%%SESSION_ID%%/gi,
|
|
234
|
+
getValue: function getValue(ctx) {
|
|
235
|
+
return ctx.sessionId;
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
pattern: /%%CORRELATOR%%/gi,
|
|
240
|
+
getValue: function getValue(ctx) {
|
|
241
|
+
return ctx.correlator;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
];
|
|
245
|
+
function isMacroPlaceholder(value) {
|
|
246
|
+
if (value == null) return true;
|
|
247
|
+
var trimmed = value.trim();
|
|
248
|
+
if (!trimmed) return true;
|
|
249
|
+
if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;
|
|
250
|
+
return /^(unknown|null|undefined|none|n\/a|\$\{[^}]+\})$/i.test(trimmed);
|
|
251
|
+
}
|
|
252
|
+
function generateCorrelator() {
|
|
253
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
254
|
+
try {
|
|
255
|
+
var _buf_, _buf_1;
|
|
256
|
+
var buf = new Uint32Array(2);
|
|
257
|
+
crypto.getRandomValues(buf);
|
|
258
|
+
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);
|
|
259
|
+
if (value > 0) {
|
|
260
|
+
return String(value);
|
|
261
|
+
}
|
|
262
|
+
} catch (unused) {}
|
|
263
|
+
}
|
|
264
|
+
return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
|
|
265
|
+
}
|
|
266
|
+
function expandInlineMacroPlaceholders(baseUrl, ctx) {
|
|
267
|
+
var url = baseUrl;
|
|
268
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
269
|
+
try {
|
|
270
|
+
for(var _iterator = INLINE_DEVICE_MACRO_REPLACEMENTS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
271
|
+
var _step_value = _step.value, pattern = _step_value.pattern, getValue = _step_value.getValue;
|
|
272
|
+
var value = getValue(ctx);
|
|
273
|
+
if (value != null && value !== "") {
|
|
274
|
+
url = url.replace(pattern, encodeURIComponent(value));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
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
|
+
return url;
|
|
292
|
+
}
|
|
293
|
+
function applyDeviceIdentityParams(params, ctx) {
|
|
294
|
+
var _ctx_deviceId, _ctx_deviceIdType;
|
|
295
|
+
var runtimeId = (_ctx_deviceId = ctx.deviceId) === null || _ctx_deviceId === void 0 ? void 0 : _ctx_deviceId.trim();
|
|
296
|
+
var runtimeType = ((_ctx_deviceIdType = ctx.deviceIdType) === null || _ctx_deviceIdType === void 0 ? void 0 : _ctx_deviceIdType.trim()) || inferDeviceIdType();
|
|
297
|
+
var tagRdid = params.get("rdid");
|
|
298
|
+
var tagType = params.get("idtype");
|
|
299
|
+
var tagLat = params.get("is_lat");
|
|
300
|
+
var latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
|
|
301
|
+
if (runtimeId) {
|
|
302
|
+
params.set("rdid", runtimeId);
|
|
303
|
+
params.set("idtype", runtimeType || tagType || "aaid");
|
|
304
|
+
params.set("is_lat", latValue !== null && latValue !== void 0 ? latValue : isMacroPlaceholder(tagLat) ? "0" : tagLat);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
var tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));
|
|
308
|
+
var tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));
|
|
309
|
+
if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {
|
|
310
|
+
params.delete("rdid");
|
|
311
|
+
params.delete("idtype");
|
|
312
|
+
params.delete("is_lat");
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (tagRdidValid) {
|
|
316
|
+
if (isMacroPlaceholder(tagType) && runtimeType) {
|
|
317
|
+
params.set("idtype", runtimeType);
|
|
318
|
+
}
|
|
319
|
+
if (isMacroPlaceholder(tagLat)) {
|
|
320
|
+
params.set("is_lat", latValue !== null && latValue !== void 0 ? latValue : "0");
|
|
321
|
+
}
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
params.delete("rdid");
|
|
325
|
+
params.delete("idtype");
|
|
326
|
+
params.delete("is_lat");
|
|
327
|
+
}
|
|
328
|
+
function removeBrokenAppNameOrphans(params, appName) {
|
|
329
|
+
var toDelete = [];
|
|
330
|
+
params.forEach(function(_value, key) {
|
|
331
|
+
if (!key || INVALID_VAST_PARAM_KEY.test(key)) {
|
|
332
|
+
toDelete.push(key);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
if (appName && appName.includes("&")) {
|
|
336
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
337
|
+
try {
|
|
338
|
+
for(var _iterator = appName.split("&").slice(1)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
339
|
+
var suffix = _step.value;
|
|
340
|
+
var trimmed = suffix.trimStart();
|
|
341
|
+
if (!trimmed) continue;
|
|
342
|
+
toDelete.push(suffix, " ".concat(trimmed), trimmed);
|
|
343
|
+
}
|
|
344
|
+
} catch (err) {
|
|
345
|
+
_didIteratorError = true;
|
|
346
|
+
_iteratorError = err;
|
|
347
|
+
} finally{
|
|
348
|
+
try {
|
|
349
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
350
|
+
_iterator.return();
|
|
351
|
+
}
|
|
352
|
+
} finally{
|
|
353
|
+
if (_didIteratorError) {
|
|
354
|
+
throw _iteratorError;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
360
|
+
try {
|
|
361
|
+
for(var _iterator1 = new Set(toDelete)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
362
|
+
var key = _step1.value;
|
|
363
|
+
if (key) params.delete(key);
|
|
364
|
+
}
|
|
365
|
+
} catch (err) {
|
|
366
|
+
_didIteratorError1 = true;
|
|
367
|
+
_iteratorError1 = err;
|
|
368
|
+
} finally{
|
|
369
|
+
try {
|
|
370
|
+
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
371
|
+
_iterator1.return();
|
|
372
|
+
}
|
|
373
|
+
} finally{
|
|
374
|
+
if (_didIteratorError1) {
|
|
375
|
+
throw _iteratorError1;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
function normalizeVastTagUrl(raw) {
|
|
381
|
+
if (!raw) return raw;
|
|
382
|
+
try {
|
|
383
|
+
var url = new URL(raw);
|
|
384
|
+
var anValue = url.searchParams.get("an");
|
|
385
|
+
if (anValue !== null) {
|
|
386
|
+
var orphanFragments = [];
|
|
387
|
+
url.searchParams.forEach(function(_value, key) {
|
|
388
|
+
if (key && INVALID_VAST_PARAM_KEY.test(key)) {
|
|
389
|
+
orphanFragments.push(key.trim());
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
if (orphanFragments.length > 0) {
|
|
393
|
+
var reconstructed = [
|
|
394
|
+
anValue.trimEnd()
|
|
395
|
+
].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
|
|
396
|
+
url.searchParams.forEach(function(_value, key) {
|
|
397
|
+
if (key && INVALID_VAST_PARAM_KEY.test(key)) {
|
|
398
|
+
url.searchParams.delete(key);
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
url.searchParams.set("an", reconstructed);
|
|
402
|
+
return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
|
|
403
|
+
return prefix + val.replace(/\+/g, "%20");
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
removeBrokenAppNameOrphans(url.searchParams);
|
|
408
|
+
return url.toString();
|
|
409
|
+
} catch (unused) {
|
|
410
|
+
return raw;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
95
413
|
function applyVastMacros(baseUrl, ctx) {
|
|
414
|
+
var expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);
|
|
96
415
|
var url;
|
|
97
416
|
try {
|
|
98
|
-
url = new URL(
|
|
417
|
+
url = new URL(normalizeVastTagUrl(expandedUrl));
|
|
99
418
|
} catch (unused) {
|
|
100
|
-
return replaceCorrelatorFallback(
|
|
419
|
+
return replaceCorrelatorFallback(expandedUrl, ctx.correlator);
|
|
101
420
|
}
|
|
102
421
|
var params = url.searchParams;
|
|
422
|
+
removeBrokenAppNameOrphans(params, ctx.appName);
|
|
103
423
|
params.set("correlator", ctx.correlator);
|
|
104
424
|
if (ctx.isCtv) {
|
|
105
425
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
@@ -137,6 +457,12 @@ function applyVastMacros(baseUrl, ctx) {
|
|
|
137
457
|
if (!ctx.isCtv) {
|
|
138
458
|
params.set("description_url", requestUrl);
|
|
139
459
|
}
|
|
460
|
+
} else {
|
|
461
|
+
var existingUrl = params.get("url") || "";
|
|
462
|
+
if (EXAMPLE_COM_URL.test(existingUrl)) {
|
|
463
|
+
params.delete("url");
|
|
464
|
+
params.delete("description_url");
|
|
465
|
+
}
|
|
140
466
|
}
|
|
141
467
|
if (ctx.adWillPlayMuted != null) {
|
|
142
468
|
params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
|
|
@@ -148,6 +474,7 @@ function applyVastMacros(baseUrl, ctx) {
|
|
|
148
474
|
params.set("msid", ctx.appId);
|
|
149
475
|
}
|
|
150
476
|
if (ctx.appName) {
|
|
477
|
+
removeBrokenAppNameOrphans(params, ctx.appName);
|
|
151
478
|
params.set("an", ctx.appName);
|
|
152
479
|
}
|
|
153
480
|
if (ctx.sessionId) {
|
|
@@ -158,15 +485,7 @@ function applyVastMacros(baseUrl, ctx) {
|
|
|
158
485
|
} else if (ctx.isCtv) {
|
|
159
486
|
params.set("dth", "5");
|
|
160
487
|
}
|
|
161
|
-
|
|
162
|
-
params.set("rdid", ctx.deviceId);
|
|
163
|
-
params.set("idtype", ctx.deviceIdType);
|
|
164
|
-
params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
|
|
165
|
-
} else {
|
|
166
|
-
params.delete("rdid");
|
|
167
|
-
params.delete("idtype");
|
|
168
|
-
params.delete("is_lat");
|
|
169
|
-
}
|
|
488
|
+
applyDeviceIdentityParams(params, ctx);
|
|
170
489
|
if (!ctx.isCtv) {
|
|
171
490
|
var consent = ctx.consent;
|
|
172
491
|
if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
|
|
@@ -184,7 +503,7 @@ function applyVastMacros(baseUrl, ctx) {
|
|
|
184
503
|
}
|
|
185
504
|
var staleKeys = [];
|
|
186
505
|
params.forEach(function(value, key) {
|
|
187
|
-
if (
|
|
506
|
+
if (isMacroPlaceholder(value)) {
|
|
188
507
|
staleKeys.push(key);
|
|
189
508
|
}
|
|
190
509
|
});
|
|
@@ -208,6 +527,7 @@ function applyVastMacros(baseUrl, ctx) {
|
|
|
208
527
|
}
|
|
209
528
|
}
|
|
210
529
|
}
|
|
530
|
+
removeBrokenAppNameOrphans(params, ctx.appName);
|
|
211
531
|
return url.toString();
|
|
212
532
|
}
|
|
213
533
|
function replaceCorrelatorFallback(baseUrl, correlator) {
|
|
@@ -282,6 +602,8 @@ function fetchConsentSignals() {
|
|
|
282
602
|
0 && (module.exports = {
|
|
283
603
|
applyVastMacros: applyVastMacros,
|
|
284
604
|
fetchConsentSignals: fetchConsentSignals,
|
|
285
|
-
generateCorrelator: generateCorrelator
|
|
605
|
+
generateCorrelator: generateCorrelator,
|
|
606
|
+
isMacroPlaceholder: isMacroPlaceholder,
|
|
607
|
+
normalizeVastTagUrl: normalizeVastTagUrl
|
|
286
608
|
});
|
|
287
609
|
//# sourceMappingURL=vastMacros.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/vastMacros.cjs","../../src/utils/vastMacros.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","__getOwnPropNames","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","vastMacros_exports","applyVastMacros","fetchConsentSignals","generateCorrelator","module","exports","crypto","getRandomValues","buf","Uint32Array","String","Math","floor","random","Number","MAX_SAFE_INTEGER","UNEXPANDED_MACRO_PATTERN","CTV_UNSUPPORTED_PARAMS","baseUrl","ctx","url","URL","replaceCorrelatorFallback","correlator","params","searchParams","set","isCtv","delete","streamCorrelator","pod","adPosition","requestUrl","contentUrl","pageUrl","adWillPlayMuted","adWillAutoPlay","appId","appName","sessionId","deviceTypeHint","deviceId","deviceIdType","limitAdTracking","consent","gdpr","gdprConsent","usPrivacy","adTest","staleKeys","forEach","push","toString","correlatorRegex","test","replace"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/vastMacros.ts\nvar vastMacros_exports = {};\n__export(vastMacros_exports, {\n applyVastMacros: () => applyVastMacros,\n fetchConsentSignals: () => fetchConsentSignals,\n generateCorrelator: () => generateCorrelator\n});\nmodule.exports = __toCommonJS(vastMacros_exports);\nfunction generateCorrelator() {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar CTV_UNSUPPORTED_PARAMS = [\n \"description_url\",\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"scor\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\"\n];\nfunction applyVastMacros(baseUrl, ctx) {\n let url;\n try {\n url = new URL(baseUrl);\n } catch {\n return replaceCorrelatorFallback(baseUrl, ctx.correlator);\n }\n const params = url.searchParams;\n params.set(\"correlator\", ctx.correlator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n } else {\n params.set(\"scor\", ctx.streamCorrelator);\n }\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n const requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n }\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n if (ctx.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n params.set(\"an\", ctx.appName);\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n if (ctx.deviceId && ctx.deviceIdType) {\n params.set(\"rdid\", ctx.deviceId);\n params.set(\"idtype\", ctx.deviceIdType);\n params.set(\"is_lat\", ctx.limitAdTracking ? \"1\" : \"0\");\n } else {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n }\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n const staleKeys = [];\n params.forEach((value, key) => {\n if (UNEXPANDED_MACRO_PATTERN.test(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n const signals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n const tasks = [];\n const tcfApi = window.__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData, success) => {\n if (settled) return;\n if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {\n }, tcData.listenerId);\n } catch {\n }\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n const uspApi = window.__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data, success) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n return Promise.all(tasks).then(() => signals);\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n applyVastMacros,\n fetchConsentSignals,\n generateCorrelator\n});\n","export interface VastConsentSignals {\n gdpr?: string | undefined;\n gdprConsent?: string | undefined;\n usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n correlator: string;\n streamCorrelator: string;\n pod?: number | undefined;\n adPosition?: number | undefined;\n isCtv?: boolean | undefined;\n contentUrl?: string | undefined;\n pageUrl?: string | undefined;\n adWillPlayMuted?: boolean | undefined;\n adWillAutoPlay?: boolean | undefined;\n appId?: string | undefined;\n appName?: string | undefined;\n sessionId?: string | undefined;\n deviceId?: string | undefined;\n deviceIdType?: string | undefined;\n limitAdTracking?: boolean | undefined;\n deviceTypeHint?: number | undefined;\n adTest?: boolean | undefined;\n consent?: VastConsentSignals | undefined;\n}\n\nexport function generateCorrelator(): string {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nconst CTV_UNSUPPORTED_PARAMS = [\n \"description_url\",\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"scor\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\",\n];\n\nexport function applyVastMacros(\n baseUrl: string,\n ctx: VastMacroContext\n): string {\n let url: URL;\n try {\n url = new URL(baseUrl);\n } catch {\n return replaceCorrelatorFallback(baseUrl, ctx.correlator);\n }\n\n const params = url.searchParams;\n\n params.set(\"correlator\", ctx.correlator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n } else {\n params.set(\"scor\", ctx.streamCorrelator);\n }\n\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n\n const requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n }\n\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n\n if (ctx.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n params.set(\"an\", ctx.appName);\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n\n if (ctx.deviceId && ctx.deviceIdType) {\n params.set(\"rdid\", ctx.deviceId);\n params.set(\"idtype\", ctx.deviceIdType);\n params.set(\"is_lat\", ctx.limitAdTracking ? \"1\" : \"0\");\n } else {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n }\n\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n\n const staleKeys: string[] = [];\n params.forEach((value, key) => {\n if (UNEXPANDED_MACRO_PATTERN.test(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n\n return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n const signals: VastConsentSignals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n\n const tasks: Promise<void>[] = [];\n\n const tcfApi = (window as any).__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n if (settled) return;\n if (\n success &&\n tcData &&\n (tcData.eventStatus === \"tcloaded\" ||\n tcData.eventStatus === \"useractioncomplete\")\n ) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n } catch {}\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n\n const uspApi = (window as any).__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n\n return Promise.all(tasks).then(() => signals);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/vastMacros.cjs","../../src/utils/vastMacros.ts","../../src/utils/vastEnvironmentSignals.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","vastMacros_exports","applyVastMacros","fetchConsentSignals","generateCorrelator","isMacroPlaceholder","normalizeVastTagUrl","module","exports","ANDROID_ID_TYPES","Set","inferDeviceIdType","navigator","ua","userAgent","test","isEquivalentDeviceIdType","tagType","runtimeType","tag","toLowerCase","runtime","has","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","getValue","ctx","deviceId","deviceIdType","limitAdTracking","appId","appName","sessionId","correlator","trimmed","trim","crypto","getRandomValues","buf","Uint32Array","String","Math","floor","random","Number","MAX_SAFE_INTEGER","expandInlineMacroPlaceholders","baseUrl","url","replace","encodeURIComponent","applyDeviceIdentityParams","params","runtimeId","tagRdid","tagLat","latValue","set","tagRdidValid","Boolean","tagTypeValid","delete","removeBrokenAppNameOrphans","toDelete","forEach","_value","push","includes","split","slice","suffix","trimStart"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/vastMacros.ts\nvar vastMacros_exports = {};\n__export(vastMacros_exports, {\n applyVastMacros: () => applyVastMacros,\n fetchConsentSignals: () => fetchConsentSignals,\n generateCorrelator: () => generateCorrelator,\n isMacroPlaceholder: () => isMacroPlaceholder,\n normalizeVastTagUrl: () => normalizeVastTagUrl\n});\nmodule.exports = __toCommonJS(vastMacros_exports);\n\n// src/utils/vastEnvironmentSignals.ts\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction inferDeviceIdType() {\n if (typeof navigator === \"undefined\") {\n return void 0;\n }\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n \"description_url\",\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"scor\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder(value) {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder(tagLat) ? \"0\" : tagLat));\n return;\n }\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));\n if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n if (tagRdidValid) {\n if (isMacroPlaceholder(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n const toDelete = [];\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.trimStart();\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\nfunction normalizeVastTagUrl(raw) {\n if (!raw) return raw;\n try {\n const url = new URL(raw);\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.trimEnd(), ...orphanFragments].filter(Boolean).join(\" & \");\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n const params = url.searchParams;\n removeBrokenAppNameOrphans(params, ctx.appName);\n params.set(\"correlator\", ctx.correlator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n } else {\n params.set(\"scor\", ctx.streamCorrelator);\n }\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n const requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n } else {\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n }\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n if (ctx.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n removeBrokenAppNameOrphans(params, ctx.appName);\n params.set(\"an\", ctx.appName);\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n applyDeviceIdentityParams(params, ctx);\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n const staleKeys = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n removeBrokenAppNameOrphans(params, ctx.appName);\n return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n const signals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n const tasks = [];\n const tcfApi = window.__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData, success) => {\n if (settled) return;\n if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {\n }, tcData.listenerId);\n } catch {\n }\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n const uspApi = window.__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data, success) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n return Promise.all(tasks).then(() => signals);\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n applyVastMacros,\n fetchConsentSignals,\n generateCorrelator,\n isMacroPlaceholder,\n normalizeVastTagUrl\n});\n","import {\n inferDeviceIdType,\n isEquivalentDeviceIdType,\n} from \"./vastEnvironmentSignals\";\n\nexport interface VastConsentSignals {\n gdpr?: string | undefined;\n gdprConsent?: string | undefined;\n usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n correlator: string;\n streamCorrelator: string;\n pod?: number | undefined;\n adPosition?: number | undefined;\n isCtv?: boolean | undefined;\n contentUrl?: string | undefined;\n pageUrl?: string | undefined;\n adWillPlayMuted?: boolean | undefined;\n adWillAutoPlay?: boolean | undefined;\n appId?: string | undefined;\n appName?: string | undefined;\n sessionId?: string | undefined;\n deviceId?: string | undefined;\n deviceIdType?: string | undefined;\n limitAdTracking?: boolean | undefined;\n deviceTypeHint?: number | undefined;\n adTest?: boolean | undefined;\n consent?: VastConsentSignals | undefined;\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nconst INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nconst EXAMPLE_COM_URL = /example\\.com/i;\nconst CTV_UNSUPPORTED_PARAMS = [\n \"description_url\",\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"scor\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\",\n];\n\nconst INLINE_DEVICE_MACRO_REPLACEMENTS: Array<{\n pattern: RegExp;\n getValue: (ctx: VastMacroContext) => string | undefined;\n}> = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) =>\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) =>\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator },\n];\n\nexport function isMacroPlaceholder(value: string | null | undefined): boolean {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\n\nexport function generateCorrelator(): string {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nfunction expandInlineMacroPlaceholders(baseUrl: string, ctx: VastMacroContext): string {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\n\nfunction applyDeviceIdentityParams(\n params: URLSearchParams,\n ctx: VastMacroContext\n): void {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue =\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined;\n\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder(tagLat) ? \"0\" : tagLat!));\n return;\n }\n\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));\n\n if (\n tagRdidValid &&\n tagTypeValid &&\n runtimeType &&\n !isEquivalentDeviceIdType(tagType!, runtimeType)\n ) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n\n if (tagRdidValid) {\n if (isMacroPlaceholder(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\n\nfunction removeBrokenAppNameOrphans(\n params: URLSearchParams,\n appName?: string\n): void {\n const toDelete: string[] = [];\n\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.trimStart();\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\n\nexport function normalizeVastTagUrl(raw: string): string {\n if (!raw) return raw;\n\n try {\n const url = new URL(raw);\n\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments: string[] = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.trimEnd(), ...orphanFragments]\n .filter(Boolean)\n .join(\" & \");\n\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\n\nexport function applyVastMacros(\n baseUrl: string,\n ctx: VastMacroContext\n): string {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url: URL;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n\n const params = url.searchParams;\n\n removeBrokenAppNameOrphans(params, ctx.appName);\n\n params.set(\"correlator\", ctx.correlator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n } else {\n params.set(\"scor\", ctx.streamCorrelator);\n }\n\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n\n const requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n } else {\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n }\n\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n\n if (ctx.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n removeBrokenAppNameOrphans(params, ctx.appName);\n params.set(\"an\", ctx.appName);\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n\n applyDeviceIdentityParams(params, ctx);\n\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n\n const staleKeys: string[] = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n\n removeBrokenAppNameOrphans(params, ctx.appName);\n\n return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n const signals: VastConsentSignals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n\n const tasks: Promise<void>[] = [];\n\n const tcfApi = (window as any).__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n if (settled) return;\n if (\n success &&\n tcData &&\n (tcData.eventStatus === \"tcloaded\" ||\n tcData.eventStatus === \"useractioncomplete\")\n ) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n } catch {}\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n\n const uspApi = (window as any).__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n\n return Promise.all(tasks).then(() => signals);\n}\n","export interface VastEnvironmentSignals {\n isCtv: boolean;\n contentUrl?: string;\n appId?: string;\n appName?: string;\n sessionId?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n deviceTypeHint?: number;\n}\n\nconst AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nconst AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nconst AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nconst AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nconst AIRY_APP_NAME = \"AiryTV Movies & TV\";\nconst AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\n\nfunction getDefaultAppId(): string {\n if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n const ua = navigator.userAgent;\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n return AIRY_ANDROID_APP_ID;\n}\n\nconst DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\",\n];\n\nconst ANDROID_ID_TYPES = new Set([\"aaid\", \"adid\"]);\n\nexport function resolveVastEnvironmentSignals(isCtv: boolean): VastEnvironmentSignals {\n const bridgeSignals = readNativeBridgeSignals();\n const deviceId = bridgeSignals.deviceId || readStoredDeviceId();\n const deviceIdType =\n bridgeSignals.deviceIdType ||\n readStoredString(\"deviceIdType\") ||\n readStoredString(\"idtype\") ||\n inferDeviceIdType();\n const limitAdTracking =\n deviceId != null\n ? bridgeSignals.limitAdTracking ?? readStoredLimitAdTracking() ?? false\n : undefined;\n\n if (isCtv) {\n return {\n isCtv: true,\n contentUrl:\n bridgeSignals.contentUrl ||\n readStoredString(\"contentUrl\") ||\n AIRY_DEFAULT_CONTENT_URL,\n appId:\n bridgeSignals.appId ||\n readStoredString(\"appId\") ||\n readStoredString(\"msid\") ||\n getDefaultAppId(),\n appName:\n bridgeSignals.appName ||\n readStoredString(\"appName\") ||\n readStoredString(\"an\") ||\n AIRY_APP_NAME,\n sessionId: getOrCreateCtvSessionId(),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceIdType ? { deviceIdType } : {}),\n ...(limitAdTracking != null ? { limitAdTracking } : {}),\n deviceTypeHint: 5,\n };\n }\n\n return {\n isCtv: false,\n ...(deviceId ? { deviceId } : {}),\n ...(deviceIdType ? { deviceIdType } : {}),\n ...(limitAdTracking != null ? { limitAdTracking } : {}),\n };\n}\n\nexport function inferDeviceIdType(): string | undefined {\n if (typeof navigator === \"undefined\") {\n return undefined;\n }\n\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return undefined;\n}\n\nexport function isEquivalentDeviceIdType(\n tagType: string | undefined,\n runtimeType: string | undefined\n): boolean {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\n\nfunction getOrCreateCtvSessionId(): string {\n const existing = readStoredString(CTV_SESSION_STORAGE_KEY);\n if (existing) {\n return existing;\n }\n\n const sessionId = createUuid();\n try {\n window.localStorage?.setItem(CTV_SESSION_STORAGE_KEY, sessionId);\n } catch {}\n return sessionId;\n}\n\nfunction createUuid(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const value = Math.floor(Math.random() * 16);\n const nibble = char === \"x\" ? value : (value & 0x3) | 0x8;\n return nibble.toString(16);\n });\n}\n\nfunction readNativeBridgeSignals(): {\n contentUrl?: string;\n appId?: string;\n appName?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n} {\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const candidates = [\n (window as any).__STORMCLOUD_CTV_AD_INFO__,\n (window as any).__STORMCLOUD_CTV__,\n (window as any).stormcloudCtv,\n (window as any).AiryTV,\n (window as any).Android,\n (window as any).webOS,\n (window as any).tizen,\n (window as any).amazon,\n ].filter(Boolean);\n\n for (const source of candidates) {\n const contentUrl =\n readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) ||\n undefined;\n const appId =\n readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) ||\n undefined;\n const appName =\n readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || undefined;\n const deviceId =\n readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\",\n ]) || undefined;\n\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n\n const deviceIdType =\n readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\",\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\",\n ]);\n\n return {\n ...(contentUrl ? { contentUrl } : {}),\n ...(appId ? { appId } : {}),\n ...(appName ? { appName } : {}),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n };\n }\n\n return {};\n}\n\nfunction readBridgeValue(source: any, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {}\n }\n }\n return undefined;\n}\n\nfunction readBridgeBoolean(source: any, keys: string[]): boolean | undefined {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {}\n }\n }\n return undefined;\n}\n\nfunction readStoredDeviceId(): string | undefined {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction readStoredString(key: string): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n try {\n const value = window.localStorage?.getItem(key);\n return value || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readStoredLimitAdTracking(): boolean | undefined {\n return normalizeBoolean(\n readStoredString(\"limitAdTracking\") ||\n readStoredString(\"limitedAdTracking\") ||\n readStoredString(\"is_lat\")\n );\n}\n\nfunction normalizeBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return undefined;\n}\n"]}
|
|
@@ -23,8 +23,10 @@ interface VastMacroContext {
|
|
|
23
23
|
adTest?: boolean | undefined;
|
|
24
24
|
consent?: VastConsentSignals | undefined;
|
|
25
25
|
}
|
|
26
|
+
declare function isMacroPlaceholder(value: string | null | undefined): boolean;
|
|
26
27
|
declare function generateCorrelator(): string;
|
|
28
|
+
declare function normalizeVastTagUrl(raw: string): string;
|
|
27
29
|
declare function applyVastMacros(baseUrl: string, ctx: VastMacroContext): string;
|
|
28
30
|
declare function fetchConsentSignals(timeoutMs?: number): Promise<VastConsentSignals>;
|
|
29
31
|
|
|
30
|
-
export { type VastConsentSignals, type VastMacroContext, applyVastMacros, fetchConsentSignals, generateCorrelator };
|
|
32
|
+
export { type VastConsentSignals, type VastMacroContext, applyVastMacros, fetchConsentSignals, generateCorrelator, isMacroPlaceholder, normalizeVastTagUrl };
|