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
package/lib/utils/tracking.cjs
CHANGED
|
@@ -154,11 +154,9 @@ function _type_of(obj) {
|
|
|
154
154
|
"@swc/helpers - typeof";
|
|
155
155
|
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
156
156
|
}
|
|
157
|
-
var __create = Object.create;
|
|
158
157
|
var __defProp = Object.defineProperty;
|
|
159
158
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
160
159
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
161
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
162
160
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
163
161
|
var __export = function __export(target, all) {
|
|
164
162
|
for(var name in all)__defProp(target, name, {
|
|
@@ -197,16 +195,6 @@ var __copyProps = function __copyProps(to, from, except, desc) {
|
|
|
197
195
|
}
|
|
198
196
|
return to;
|
|
199
197
|
};
|
|
200
|
-
var __toESM = function __toESM(mod, isNodeMode, target) {
|
|
201
|
-
return target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(// If the importer is in node compatibility mode or this is not an ESM
|
|
202
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
203
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
204
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
205
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
206
|
-
value: mod,
|
|
207
|
-
enumerable: true
|
|
208
|
-
}) : target, mod);
|
|
209
|
-
};
|
|
210
198
|
var __toCommonJS = function __toCommonJS(mod) {
|
|
211
199
|
return __copyProps(__defProp({}, "__esModule", {
|
|
212
200
|
value: true
|
|
@@ -241,160 +229,83 @@ __export(tracking_exports, {
|
|
|
241
229
|
}
|
|
242
230
|
});
|
|
243
231
|
module.exports = __toCommonJS(tracking_exports);
|
|
244
|
-
// src/utils/
|
|
245
|
-
var
|
|
232
|
+
// src/utils/trackingIngest.ts
|
|
233
|
+
var DEFAULT_TRACKING_INGEST_CONFIG = {
|
|
246
234
|
enabled: true,
|
|
247
|
-
|
|
248
|
-
brokerPort: 8883,
|
|
249
|
-
wsPort: 8084,
|
|
250
|
-
username: "for-sonifi",
|
|
251
|
-
password: "sonifi-mqtt",
|
|
252
|
-
topicPrefix: "adstorm/players",
|
|
253
|
-
qos: 1
|
|
235
|
+
baseUrl: "https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking"
|
|
254
236
|
};
|
|
255
|
-
var
|
|
256
|
-
function
|
|
257
|
-
return
|
|
258
|
-
}
|
|
259
|
-
function buildMQTTBrokerUrl() {
|
|
260
|
-
if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
|
|
261
|
-
return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
|
|
262
|
-
}
|
|
263
|
-
function buildPlayerTopic(licenseKey, channel) {
|
|
264
|
-
return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
|
|
237
|
+
var trackingIngestConfig = _object_spread({}, DEFAULT_TRACKING_INGEST_CONFIG);
|
|
238
|
+
function isTrackingIngestEnabled() {
|
|
239
|
+
return trackingIngestConfig.enabled === true;
|
|
265
240
|
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
var LOG = "[StormcloudVideoPlayer][MQTT]";
|
|
269
|
-
var KEEPALIVE_SECONDS = 30;
|
|
270
|
-
var CONNECT_TIMEOUT_MS = 1e4;
|
|
271
|
-
var RECONNECT_BASE_MS = 5e3;
|
|
272
|
-
var RECONNECT_MAX_MS = 6e4;
|
|
273
|
-
var MAX_RECONNECT_ATTEMPTS = 8;
|
|
274
|
-
var COOLDOWN_MS = 10 * 6e4;
|
|
275
|
-
var client = null;
|
|
276
|
-
var status = "disconnected";
|
|
277
|
-
var reconnectAttempts = 0;
|
|
278
|
-
var reconnectTimer = null;
|
|
279
|
-
var stopped = false;
|
|
280
|
-
function clearReconnectTimer() {
|
|
281
|
-
if (reconnectTimer) {
|
|
282
|
-
clearTimeout(reconnectTimer);
|
|
283
|
-
reconnectTimer = null;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
function teardownClient() {
|
|
287
|
-
if (client) {
|
|
288
|
-
try {
|
|
289
|
-
client.removeAllListeners();
|
|
290
|
-
client.end(true);
|
|
291
|
-
} catch (unused) {}
|
|
292
|
-
client = null;
|
|
293
|
-
}
|
|
241
|
+
function normalizeIngestBaseUrl(baseUrl) {
|
|
242
|
+
return baseUrl.replace(/\/+$/, "");
|
|
294
243
|
}
|
|
295
|
-
function
|
|
296
|
-
|
|
297
|
-
if (
|
|
298
|
-
|
|
299
|
-
teardownClient();
|
|
300
|
-
status = "disconnected";
|
|
301
|
-
reconnectTimer = setTimeout(function() {
|
|
302
|
-
reconnectTimer = null;
|
|
303
|
-
reconnectAttempts = 0;
|
|
304
|
-
openConnection();
|
|
305
|
-
}, COOLDOWN_MS);
|
|
306
|
-
return;
|
|
244
|
+
function buildTrackingIngestUrl(channel) {
|
|
245
|
+
var base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);
|
|
246
|
+
if (channel === "impressions") {
|
|
247
|
+
return "".concat(base, "/impressions/ingest");
|
|
307
248
|
}
|
|
308
|
-
|
|
309
|
-
var jitter = Math.floor(Math.random() * 1e3);
|
|
310
|
-
reconnectAttempts += 1;
|
|
311
|
-
reconnectTimer = setTimeout(function() {
|
|
312
|
-
reconnectTimer = null;
|
|
313
|
-
openConnection();
|
|
314
|
-
}, delay + jitter);
|
|
249
|
+
return "".concat(base, "/metrics/ingest");
|
|
315
250
|
}
|
|
316
|
-
function
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
stopped = false;
|
|
373
|
-
reconnectAttempts = 0;
|
|
374
|
-
openConnection();
|
|
375
|
-
}
|
|
376
|
-
function ensureMQTTClient() {
|
|
377
|
-
if (isMQTTEnabled() && !client && !reconnectTimer) {
|
|
378
|
-
initMQTTClient();
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
function publishMQTT(topic, payload) {
|
|
382
|
-
if (!isMQTTEnabled()) {
|
|
383
|
-
return false;
|
|
384
|
-
}
|
|
385
|
-
ensureMQTTClient();
|
|
386
|
-
if (!client || !client.connected) {
|
|
387
|
-
return false;
|
|
388
|
-
}
|
|
389
|
-
try {
|
|
390
|
-
client.publish(topic, JSON.stringify(payload), {
|
|
391
|
-
qos: mqttConfig.qos
|
|
251
|
+
function ingestPlayerTracking(licenseKey, channel, body) {
|
|
252
|
+
return _async_to_generator(function() {
|
|
253
|
+
var response, error;
|
|
254
|
+
return _ts_generator(this, function(_state) {
|
|
255
|
+
switch(_state.label){
|
|
256
|
+
case 0:
|
|
257
|
+
if (!isTrackingIngestEnabled() || !licenseKey) {
|
|
258
|
+
return [
|
|
259
|
+
2,
|
|
260
|
+
false
|
|
261
|
+
];
|
|
262
|
+
}
|
|
263
|
+
_state.label = 1;
|
|
264
|
+
case 1:
|
|
265
|
+
_state.trys.push([
|
|
266
|
+
1,
|
|
267
|
+
3,
|
|
268
|
+
,
|
|
269
|
+
4
|
|
270
|
+
]);
|
|
271
|
+
return [
|
|
272
|
+
4,
|
|
273
|
+
fetch(buildTrackingIngestUrl(channel), {
|
|
274
|
+
method: "POST",
|
|
275
|
+
headers: {
|
|
276
|
+
"Content-Type": "application/json",
|
|
277
|
+
Authorization: "License-Key ".concat(licenseKey)
|
|
278
|
+
},
|
|
279
|
+
body: JSON.stringify(body)
|
|
280
|
+
})
|
|
281
|
+
];
|
|
282
|
+
case 2:
|
|
283
|
+
response = _state.sent();
|
|
284
|
+
if (!response.ok) {
|
|
285
|
+
console.warn("[StormcloudVideoPlayer] Tracking ingest failed (".concat(response.status, ") for ").concat(channel));
|
|
286
|
+
return [
|
|
287
|
+
2,
|
|
288
|
+
false
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
return [
|
|
292
|
+
2,
|
|
293
|
+
true
|
|
294
|
+
];
|
|
295
|
+
case 3:
|
|
296
|
+
error = _state.sent();
|
|
297
|
+
console.warn("[StormcloudVideoPlayer] Tracking ingest error for ".concat(channel, ":"), error);
|
|
298
|
+
return [
|
|
299
|
+
2,
|
|
300
|
+
false
|
|
301
|
+
];
|
|
302
|
+
case 4:
|
|
303
|
+
return [
|
|
304
|
+
2
|
|
305
|
+
];
|
|
306
|
+
}
|
|
392
307
|
});
|
|
393
|
-
|
|
394
|
-
} catch (err) {
|
|
395
|
-
console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
|
|
396
|
-
return false;
|
|
397
|
-
}
|
|
308
|
+
})();
|
|
398
309
|
}
|
|
399
310
|
// src/utils/vastEnvironmentSignals.ts
|
|
400
311
|
var PLAYER_ID_STORAGE_KEY = "stormcloud.player.id";
|
|
@@ -1078,7 +989,7 @@ function getBrowserID(clientInfo) {
|
|
|
1078
989
|
})();
|
|
1079
990
|
}
|
|
1080
991
|
function canPublish(licenseKey) {
|
|
1081
|
-
return Boolean(
|
|
992
|
+
return Boolean(isTrackingIngestEnabled() && licenseKey);
|
|
1082
993
|
}
|
|
1083
994
|
function buildPlayerMetricEvent() {
|
|
1084
995
|
return _async_to_generator(function() {
|
|
@@ -1120,10 +1031,6 @@ function buildPlayerMetricEvent() {
|
|
|
1120
1031
|
});
|
|
1121
1032
|
}).apply(this, arguments);
|
|
1122
1033
|
}
|
|
1123
|
-
function publishTracking(licenseKey, channel, body) {
|
|
1124
|
-
ensureMQTTClient();
|
|
1125
|
-
publishMQTT(buildPlayerTopic(licenseKey, channel), body);
|
|
1126
|
-
}
|
|
1127
1034
|
function sendInitialTracking(_0) {
|
|
1128
1035
|
return _async_to_generator(function(licenseKey) {
|
|
1129
1036
|
var context, metricEvent, error;
|
|
@@ -1139,9 +1046,9 @@ function sendInitialTracking(_0) {
|
|
|
1139
1046
|
case 1:
|
|
1140
1047
|
_state.trys.push([
|
|
1141
1048
|
1,
|
|
1142
|
-
|
|
1049
|
+
4,
|
|
1143
1050
|
,
|
|
1144
|
-
|
|
1051
|
+
5
|
|
1145
1052
|
]);
|
|
1146
1053
|
return [
|
|
1147
1054
|
4,
|
|
@@ -1152,23 +1059,28 @@ function sendInitialTracking(_0) {
|
|
|
1152
1059
|
];
|
|
1153
1060
|
case 2:
|
|
1154
1061
|
metricEvent = _state.sent();
|
|
1155
|
-
publishTracking(licenseKey, "metrics", {
|
|
1156
|
-
events: [
|
|
1157
|
-
metricEvent
|
|
1158
|
-
]
|
|
1159
|
-
});
|
|
1160
1062
|
return [
|
|
1161
|
-
|
|
1162
|
-
|
|
1063
|
+
4,
|
|
1064
|
+
ingestPlayerTracking(licenseKey, "metrics", {
|
|
1065
|
+
events: [
|
|
1066
|
+
metricEvent
|
|
1067
|
+
]
|
|
1068
|
+
})
|
|
1163
1069
|
];
|
|
1164
1070
|
case 3:
|
|
1071
|
+
_state.sent();
|
|
1072
|
+
return [
|
|
1073
|
+
3,
|
|
1074
|
+
5
|
|
1075
|
+
];
|
|
1076
|
+
case 4:
|
|
1165
1077
|
error = _state.sent();
|
|
1166
1078
|
console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
|
|
1167
1079
|
return [
|
|
1168
1080
|
3,
|
|
1169
|
-
|
|
1081
|
+
5
|
|
1170
1082
|
];
|
|
1171
|
-
case
|
|
1083
|
+
case 5:
|
|
1172
1084
|
return [
|
|
1173
1085
|
2
|
|
1174
1086
|
];
|
|
@@ -1279,9 +1191,9 @@ function sendAdImpressionTracking(_0, _1) {
|
|
|
1279
1191
|
case 1:
|
|
1280
1192
|
_state.trys.push([
|
|
1281
1193
|
1,
|
|
1282
|
-
|
|
1194
|
+
5,
|
|
1283
1195
|
,
|
|
1284
|
-
|
|
1196
|
+
6
|
|
1285
1197
|
]);
|
|
1286
1198
|
return [
|
|
1287
1199
|
4,
|
|
@@ -1291,29 +1203,43 @@ function sendAdImpressionTracking(_0, _1) {
|
|
|
1291
1203
|
];
|
|
1292
1204
|
case 2:
|
|
1293
1205
|
metricEvent = _state.sent();
|
|
1294
|
-
publishTracking(licenseKey, "heartbeat", metricEvent);
|
|
1295
|
-
publishTracking(licenseKey, "impressions", {
|
|
1296
|
-
events: [
|
|
1297
|
-
{
|
|
1298
|
-
player_id: metricEvent.player_id,
|
|
1299
|
-
ad_played_count: 1,
|
|
1300
|
-
ad_url: adImpressionInfo.adUrl,
|
|
1301
|
-
capture_at: adImpressionInfo.timestamp
|
|
1302
|
-
}
|
|
1303
|
-
]
|
|
1304
|
-
});
|
|
1305
1206
|
return [
|
|
1306
|
-
|
|
1307
|
-
|
|
1207
|
+
4,
|
|
1208
|
+
ingestPlayerTracking(licenseKey, "metrics", {
|
|
1209
|
+
events: [
|
|
1210
|
+
metricEvent
|
|
1211
|
+
]
|
|
1212
|
+
})
|
|
1308
1213
|
];
|
|
1309
1214
|
case 3:
|
|
1215
|
+
_state.sent();
|
|
1216
|
+
return [
|
|
1217
|
+
4,
|
|
1218
|
+
ingestPlayerTracking(licenseKey, "impressions", {
|
|
1219
|
+
events: [
|
|
1220
|
+
{
|
|
1221
|
+
player_id: metricEvent.player_id,
|
|
1222
|
+
ad_played_count: 1,
|
|
1223
|
+
ad_url: adImpressionInfo.adUrl,
|
|
1224
|
+
capture_at: adImpressionInfo.timestamp
|
|
1225
|
+
}
|
|
1226
|
+
]
|
|
1227
|
+
})
|
|
1228
|
+
];
|
|
1229
|
+
case 4:
|
|
1230
|
+
_state.sent();
|
|
1231
|
+
return [
|
|
1232
|
+
3,
|
|
1233
|
+
6
|
|
1234
|
+
];
|
|
1235
|
+
case 5:
|
|
1310
1236
|
error = _state.sent();
|
|
1311
1237
|
console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
|
|
1312
1238
|
return [
|
|
1313
1239
|
3,
|
|
1314
|
-
|
|
1240
|
+
6
|
|
1315
1241
|
];
|
|
1316
|
-
case
|
|
1242
|
+
case 6:
|
|
1317
1243
|
return [
|
|
1318
1244
|
2
|
|
1319
1245
|
];
|
|
@@ -1336,9 +1262,9 @@ function sendHeartbeat(_0) {
|
|
|
1336
1262
|
case 1:
|
|
1337
1263
|
_state.trys.push([
|
|
1338
1264
|
1,
|
|
1339
|
-
|
|
1265
|
+
4,
|
|
1340
1266
|
,
|
|
1341
|
-
|
|
1267
|
+
5
|
|
1342
1268
|
]);
|
|
1343
1269
|
return [
|
|
1344
1270
|
4,
|
|
@@ -1346,19 +1272,28 @@ function sendHeartbeat(_0) {
|
|
|
1346
1272
|
];
|
|
1347
1273
|
case 2:
|
|
1348
1274
|
heartbeatData = _state.sent();
|
|
1349
|
-
publishTracking(licenseKey, "heartbeat", heartbeatData);
|
|
1350
1275
|
return [
|
|
1351
|
-
|
|
1352
|
-
|
|
1276
|
+
4,
|
|
1277
|
+
ingestPlayerTracking(licenseKey, "metrics", {
|
|
1278
|
+
events: [
|
|
1279
|
+
heartbeatData
|
|
1280
|
+
]
|
|
1281
|
+
})
|
|
1353
1282
|
];
|
|
1354
1283
|
case 3:
|
|
1284
|
+
_state.sent();
|
|
1285
|
+
return [
|
|
1286
|
+
3,
|
|
1287
|
+
5
|
|
1288
|
+
];
|
|
1289
|
+
case 4:
|
|
1355
1290
|
error = _state.sent();
|
|
1356
1291
|
console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
|
|
1357
1292
|
return [
|
|
1358
1293
|
3,
|
|
1359
|
-
|
|
1294
|
+
5
|
|
1360
1295
|
];
|
|
1361
|
-
case
|
|
1296
|
+
case 5:
|
|
1362
1297
|
return [
|
|
1363
1298
|
2
|
|
1364
1299
|
];
|