stormcloud-video-player 0.8.56 → 0.8.57
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 +2 -2
- package/dist/stormcloud-vp.min.js +1 -3
- package/lib/index.cjs +161 -283
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +12 -29
- package/lib/index.d.ts +12 -29
- package/lib/index.js +141 -227
- package/lib/index.js.map +1 -1
- package/lib/player/AdBreakOrchestrator.cjs +118 -188
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdConfigManager.cjs +103 -200
- package/lib/player/AdConfigManager.cjs.map +1 -1
- package/lib/player/AdConfigManager.d.cts +0 -1
- package/lib/player/AdTimingService.cjs.map +1 -1
- package/lib/player/HlsEngine.cjs.map +1 -1
- package/lib/player/PlaceholderLayer.cjs.map +1 -1
- package/lib/player/PlayerControls.cjs.map +1 -1
- package/lib/player/Scte35CueManager.cjs.map +1 -1
- package/lib/player/Scte35Parser.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +134 -205
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/playerTypes.cjs.map +1 -1
- package/lib/players/FilePlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.cjs +134 -205
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/index.cjs +134 -205
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/pal.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +134 -205
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/ctvVastSignals.cjs.map +1 -1
- package/lib/utils/devUrl.cjs.map +1 -1
- package/lib/utils/polyfills.cjs.map +1 -1
- package/lib/utils/tracking.cjs +134 -199
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/trackingIngest.cjs +322 -0
- package/lib/utils/trackingIngest.cjs.map +1 -0
- package/lib/utils/trackingIngest.d.cts +14 -0
- package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/lib/utils/vastTrackingMacros.cjs.map +1 -1
- package/package.json +1 -3
- package/lib/utils/mqttClient.cjs +0 -305
- package/lib/utils/mqttClient.cjs.map +0 -1
- package/lib/utils/mqttClient.d.cts +0 -13
- package/lib/utils/mqttConfig.cjs +0 -139
- package/lib/utils/mqttConfig.cjs.map +0 -1
- package/lib/utils/mqttConfig.d.cts +0 -20
- package/src/certs/emqxsl-ca.crt +0 -22
|
@@ -218,11 +218,9 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
218
218
|
if (n === "Map" || n === "Set") return Array.from(n);
|
|
219
219
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
220
220
|
}
|
|
221
|
-
var __create = Object.create;
|
|
222
221
|
var __defProp = Object.defineProperty;
|
|
223
222
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
224
223
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
225
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
226
224
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
227
225
|
var __export = function __export(target, all) {
|
|
228
226
|
for(var name in all)__defProp(target, name, {
|
|
@@ -261,16 +259,6 @@ var __copyProps = function __copyProps(to, from, except, desc) {
|
|
|
261
259
|
}
|
|
262
260
|
return to;
|
|
263
261
|
};
|
|
264
|
-
var __toESM = function __toESM(mod, isNodeMode, target) {
|
|
265
|
-
return target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM
|
|
266
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
267
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
268
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
269
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
270
|
-
value: mod,
|
|
271
|
-
enumerable: true
|
|
272
|
-
}) : target, mod);
|
|
273
|
-
};
|
|
274
262
|
var __toCommonJS = function __toCommonJS(mod) {
|
|
275
263
|
return __copyProps(__defProp({}, "__esModule", {
|
|
276
264
|
value: true
|
|
@@ -284,160 +272,83 @@ __export(AdBreakOrchestrator_exports, {
|
|
|
284
272
|
}
|
|
285
273
|
});
|
|
286
274
|
module.exports = __toCommonJS(AdBreakOrchestrator_exports);
|
|
287
|
-
// src/utils/
|
|
288
|
-
var
|
|
275
|
+
// src/utils/trackingIngest.ts
|
|
276
|
+
var DEFAULT_TRACKING_INGEST_CONFIG = {
|
|
289
277
|
enabled: true,
|
|
290
|
-
|
|
291
|
-
brokerPort: 8883,
|
|
292
|
-
wsPort: 8084,
|
|
293
|
-
username: "for-sonifi",
|
|
294
|
-
password: "sonifi-mqtt",
|
|
295
|
-
topicPrefix: "adstorm/players",
|
|
296
|
-
qos: 1
|
|
278
|
+
baseUrl: "https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking"
|
|
297
279
|
};
|
|
298
|
-
var
|
|
299
|
-
function
|
|
300
|
-
return
|
|
301
|
-
}
|
|
302
|
-
function buildMQTTBrokerUrl() {
|
|
303
|
-
if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
|
|
304
|
-
return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
|
|
305
|
-
}
|
|
306
|
-
function buildPlayerTopic(licenseKey, channel) {
|
|
307
|
-
return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
|
|
280
|
+
var trackingIngestConfig = _object_spread({}, DEFAULT_TRACKING_INGEST_CONFIG);
|
|
281
|
+
function isTrackingIngestEnabled() {
|
|
282
|
+
return trackingIngestConfig.enabled === true;
|
|
308
283
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
var LOG = "[StormcloudVideoPlayer][MQTT]";
|
|
312
|
-
var KEEPALIVE_SECONDS = 30;
|
|
313
|
-
var CONNECT_TIMEOUT_MS = 1e4;
|
|
314
|
-
var RECONNECT_BASE_MS = 5e3;
|
|
315
|
-
var RECONNECT_MAX_MS = 6e4;
|
|
316
|
-
var MAX_RECONNECT_ATTEMPTS = 8;
|
|
317
|
-
var COOLDOWN_MS = 10 * 6e4;
|
|
318
|
-
var client = null;
|
|
319
|
-
var status = "disconnected";
|
|
320
|
-
var reconnectAttempts = 0;
|
|
321
|
-
var reconnectTimer = null;
|
|
322
|
-
var stopped = false;
|
|
323
|
-
function clearReconnectTimer() {
|
|
324
|
-
if (reconnectTimer) {
|
|
325
|
-
clearTimeout(reconnectTimer);
|
|
326
|
-
reconnectTimer = null;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
function teardownClient() {
|
|
330
|
-
if (client) {
|
|
331
|
-
try {
|
|
332
|
-
client.removeAllListeners();
|
|
333
|
-
client.end(true);
|
|
334
|
-
} catch (unused) {}
|
|
335
|
-
client = null;
|
|
336
|
-
}
|
|
284
|
+
function normalizeIngestBaseUrl(baseUrl) {
|
|
285
|
+
return baseUrl.replace(/\/+$/, "");
|
|
337
286
|
}
|
|
338
|
-
function
|
|
339
|
-
|
|
340
|
-
if (
|
|
341
|
-
|
|
342
|
-
teardownClient();
|
|
343
|
-
status = "disconnected";
|
|
344
|
-
reconnectTimer = setTimeout(function() {
|
|
345
|
-
reconnectTimer = null;
|
|
346
|
-
reconnectAttempts = 0;
|
|
347
|
-
openConnection();
|
|
348
|
-
}, COOLDOWN_MS);
|
|
349
|
-
return;
|
|
287
|
+
function buildTrackingIngestUrl(channel) {
|
|
288
|
+
var base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);
|
|
289
|
+
if (channel === "impressions") {
|
|
290
|
+
return "".concat(base, "/impressions/ingest");
|
|
350
291
|
}
|
|
351
|
-
|
|
352
|
-
var jitter = Math.floor(Math.random() * 1e3);
|
|
353
|
-
reconnectAttempts += 1;
|
|
354
|
-
reconnectTimer = setTimeout(function() {
|
|
355
|
-
reconnectTimer = null;
|
|
356
|
-
openConnection();
|
|
357
|
-
}, delay + jitter);
|
|
292
|
+
return "".concat(base, "/metrics/ingest");
|
|
358
293
|
}
|
|
359
|
-
function
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
stopped = false;
|
|
416
|
-
reconnectAttempts = 0;
|
|
417
|
-
openConnection();
|
|
418
|
-
}
|
|
419
|
-
function ensureMQTTClient() {
|
|
420
|
-
if (isMQTTEnabled() && !client && !reconnectTimer) {
|
|
421
|
-
initMQTTClient();
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
function publishMQTT(topic, payload) {
|
|
425
|
-
if (!isMQTTEnabled()) {
|
|
426
|
-
return false;
|
|
427
|
-
}
|
|
428
|
-
ensureMQTTClient();
|
|
429
|
-
if (!client || !client.connected) {
|
|
430
|
-
return false;
|
|
431
|
-
}
|
|
432
|
-
try {
|
|
433
|
-
client.publish(topic, JSON.stringify(payload), {
|
|
434
|
-
qos: mqttConfig.qos
|
|
294
|
+
function ingestPlayerTracking(licenseKey, channel, body) {
|
|
295
|
+
return _async_to_generator(function() {
|
|
296
|
+
var response, error;
|
|
297
|
+
return _ts_generator(this, function(_state) {
|
|
298
|
+
switch(_state.label){
|
|
299
|
+
case 0:
|
|
300
|
+
if (!isTrackingIngestEnabled() || !licenseKey) {
|
|
301
|
+
return [
|
|
302
|
+
2,
|
|
303
|
+
false
|
|
304
|
+
];
|
|
305
|
+
}
|
|
306
|
+
_state.label = 1;
|
|
307
|
+
case 1:
|
|
308
|
+
_state.trys.push([
|
|
309
|
+
1,
|
|
310
|
+
3,
|
|
311
|
+
,
|
|
312
|
+
4
|
|
313
|
+
]);
|
|
314
|
+
return [
|
|
315
|
+
4,
|
|
316
|
+
fetch(buildTrackingIngestUrl(channel), {
|
|
317
|
+
method: "POST",
|
|
318
|
+
headers: {
|
|
319
|
+
"Content-Type": "application/json",
|
|
320
|
+
Authorization: "License-Key ".concat(licenseKey)
|
|
321
|
+
},
|
|
322
|
+
body: JSON.stringify(body)
|
|
323
|
+
})
|
|
324
|
+
];
|
|
325
|
+
case 2:
|
|
326
|
+
response = _state.sent();
|
|
327
|
+
if (!response.ok) {
|
|
328
|
+
console.warn("[StormcloudVideoPlayer] Tracking ingest failed (".concat(response.status, ") for ").concat(channel));
|
|
329
|
+
return [
|
|
330
|
+
2,
|
|
331
|
+
false
|
|
332
|
+
];
|
|
333
|
+
}
|
|
334
|
+
return [
|
|
335
|
+
2,
|
|
336
|
+
true
|
|
337
|
+
];
|
|
338
|
+
case 3:
|
|
339
|
+
error = _state.sent();
|
|
340
|
+
console.warn("[StormcloudVideoPlayer] Tracking ingest error for ".concat(channel, ":"), error);
|
|
341
|
+
return [
|
|
342
|
+
2,
|
|
343
|
+
false
|
|
344
|
+
];
|
|
345
|
+
case 4:
|
|
346
|
+
return [
|
|
347
|
+
2
|
|
348
|
+
];
|
|
349
|
+
}
|
|
435
350
|
});
|
|
436
|
-
|
|
437
|
-
} catch (err) {
|
|
438
|
-
console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
|
|
439
|
-
return false;
|
|
440
|
-
}
|
|
351
|
+
})();
|
|
441
352
|
}
|
|
442
353
|
// src/utils/vastEnvironmentSignals.ts
|
|
443
354
|
var PLAYER_ID_STORAGE_KEY = "stormcloud.player.id";
|
|
@@ -1121,7 +1032,7 @@ function getBrowserID(clientInfo) {
|
|
|
1121
1032
|
})();
|
|
1122
1033
|
}
|
|
1123
1034
|
function canPublish(licenseKey) {
|
|
1124
|
-
return Boolean(
|
|
1035
|
+
return Boolean(isTrackingIngestEnabled() && licenseKey);
|
|
1125
1036
|
}
|
|
1126
1037
|
function buildPlayerMetricEvent() {
|
|
1127
1038
|
return _async_to_generator(function() {
|
|
@@ -1163,10 +1074,6 @@ function buildPlayerMetricEvent() {
|
|
|
1163
1074
|
});
|
|
1164
1075
|
}).apply(this, arguments);
|
|
1165
1076
|
}
|
|
1166
|
-
function publishTracking(licenseKey, channel, body) {
|
|
1167
|
-
ensureMQTTClient();
|
|
1168
|
-
publishMQTT(buildPlayerTopic(licenseKey, channel), body);
|
|
1169
|
-
}
|
|
1170
1077
|
function sendAdLoadedTracking(_0, _1) {
|
|
1171
1078
|
return _async_to_generator(function(licenseKey, adLoadedInfo) {
|
|
1172
1079
|
var context, error;
|
|
@@ -1226,9 +1133,9 @@ function sendAdImpressionTracking(_0, _1) {
|
|
|
1226
1133
|
case 1:
|
|
1227
1134
|
_state.trys.push([
|
|
1228
1135
|
1,
|
|
1229
|
-
|
|
1136
|
+
5,
|
|
1230
1137
|
,
|
|
1231
|
-
|
|
1138
|
+
6
|
|
1232
1139
|
]);
|
|
1233
1140
|
return [
|
|
1234
1141
|
4,
|
|
@@ -1238,29 +1145,43 @@ function sendAdImpressionTracking(_0, _1) {
|
|
|
1238
1145
|
];
|
|
1239
1146
|
case 2:
|
|
1240
1147
|
metricEvent = _state.sent();
|
|
1241
|
-
publishTracking(licenseKey, "heartbeat", metricEvent);
|
|
1242
|
-
publishTracking(licenseKey, "impressions", {
|
|
1243
|
-
events: [
|
|
1244
|
-
{
|
|
1245
|
-
player_id: metricEvent.player_id,
|
|
1246
|
-
ad_played_count: 1,
|
|
1247
|
-
ad_url: adImpressionInfo.adUrl,
|
|
1248
|
-
capture_at: adImpressionInfo.timestamp
|
|
1249
|
-
}
|
|
1250
|
-
]
|
|
1251
|
-
});
|
|
1252
1148
|
return [
|
|
1253
|
-
|
|
1254
|
-
|
|
1149
|
+
4,
|
|
1150
|
+
ingestPlayerTracking(licenseKey, "metrics", {
|
|
1151
|
+
events: [
|
|
1152
|
+
metricEvent
|
|
1153
|
+
]
|
|
1154
|
+
})
|
|
1255
1155
|
];
|
|
1256
1156
|
case 3:
|
|
1157
|
+
_state.sent();
|
|
1158
|
+
return [
|
|
1159
|
+
4,
|
|
1160
|
+
ingestPlayerTracking(licenseKey, "impressions", {
|
|
1161
|
+
events: [
|
|
1162
|
+
{
|
|
1163
|
+
player_id: metricEvent.player_id,
|
|
1164
|
+
ad_played_count: 1,
|
|
1165
|
+
ad_url: adImpressionInfo.adUrl,
|
|
1166
|
+
capture_at: adImpressionInfo.timestamp
|
|
1167
|
+
}
|
|
1168
|
+
]
|
|
1169
|
+
})
|
|
1170
|
+
];
|
|
1171
|
+
case 4:
|
|
1172
|
+
_state.sent();
|
|
1173
|
+
return [
|
|
1174
|
+
3,
|
|
1175
|
+
6
|
|
1176
|
+
];
|
|
1177
|
+
case 5:
|
|
1257
1178
|
error = _state.sent();
|
|
1258
1179
|
console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
|
|
1259
1180
|
return [
|
|
1260
1181
|
3,
|
|
1261
|
-
|
|
1182
|
+
6
|
|
1262
1183
|
];
|
|
1263
|
-
case
|
|
1184
|
+
case 6:
|
|
1264
1185
|
return [
|
|
1265
1186
|
2
|
|
1266
1187
|
];
|
|
@@ -1283,9 +1204,9 @@ function sendHeartbeat(_0) {
|
|
|
1283
1204
|
case 1:
|
|
1284
1205
|
_state.trys.push([
|
|
1285
1206
|
1,
|
|
1286
|
-
|
|
1207
|
+
4,
|
|
1287
1208
|
,
|
|
1288
|
-
|
|
1209
|
+
5
|
|
1289
1210
|
]);
|
|
1290
1211
|
return [
|
|
1291
1212
|
4,
|
|
@@ -1293,19 +1214,28 @@ function sendHeartbeat(_0) {
|
|
|
1293
1214
|
];
|
|
1294
1215
|
case 2:
|
|
1295
1216
|
heartbeatData = _state.sent();
|
|
1296
|
-
publishTracking(licenseKey, "heartbeat", heartbeatData);
|
|
1297
1217
|
return [
|
|
1298
|
-
|
|
1299
|
-
|
|
1218
|
+
4,
|
|
1219
|
+
ingestPlayerTracking(licenseKey, "metrics", {
|
|
1220
|
+
events: [
|
|
1221
|
+
heartbeatData
|
|
1222
|
+
]
|
|
1223
|
+
})
|
|
1300
1224
|
];
|
|
1301
1225
|
case 3:
|
|
1226
|
+
_state.sent();
|
|
1227
|
+
return [
|
|
1228
|
+
3,
|
|
1229
|
+
5
|
|
1230
|
+
];
|
|
1231
|
+
case 4:
|
|
1302
1232
|
error = _state.sent();
|
|
1303
1233
|
console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
|
|
1304
1234
|
return [
|
|
1305
1235
|
3,
|
|
1306
|
-
|
|
1236
|
+
5
|
|
1307
1237
|
];
|
|
1308
|
-
case
|
|
1238
|
+
case 5:
|
|
1309
1239
|
return [
|
|
1310
1240
|
2
|
|
1311
1241
|
];
|