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.
Files changed (51) hide show
  1. package/README.md +2 -2
  2. package/dist/stormcloud-vp.min.js +1 -3
  3. package/lib/index.cjs +161 -283
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +12 -29
  6. package/lib/index.d.ts +12 -29
  7. package/lib/index.js +141 -227
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/AdBreakOrchestrator.cjs +118 -188
  10. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  11. package/lib/player/AdConfigManager.cjs +103 -200
  12. package/lib/player/AdConfigManager.cjs.map +1 -1
  13. package/lib/player/AdConfigManager.d.cts +0 -1
  14. package/lib/player/AdTimingService.cjs.map +1 -1
  15. package/lib/player/HlsEngine.cjs.map +1 -1
  16. package/lib/player/PlaceholderLayer.cjs.map +1 -1
  17. package/lib/player/PlayerControls.cjs.map +1 -1
  18. package/lib/player/Scte35CueManager.cjs.map +1 -1
  19. package/lib/player/Scte35Parser.cjs.map +1 -1
  20. package/lib/player/StormcloudVideoPlayer.cjs +134 -205
  21. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  22. package/lib/player/playerTypes.cjs.map +1 -1
  23. package/lib/players/FilePlayer.cjs.map +1 -1
  24. package/lib/players/HlsPlayer.cjs +134 -205
  25. package/lib/players/HlsPlayer.cjs.map +1 -1
  26. package/lib/players/index.cjs +134 -205
  27. package/lib/players/index.cjs.map +1 -1
  28. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  29. package/lib/sdk/pal.cjs.map +1 -1
  30. package/lib/ui/StormcloudVideoPlayer.cjs +134 -205
  31. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  32. package/lib/utils/browserCompat.cjs.map +1 -1
  33. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  34. package/lib/utils/devUrl.cjs.map +1 -1
  35. package/lib/utils/polyfills.cjs.map +1 -1
  36. package/lib/utils/tracking.cjs +134 -199
  37. package/lib/utils/tracking.cjs.map +1 -1
  38. package/lib/utils/trackingIngest.cjs +322 -0
  39. package/lib/utils/trackingIngest.cjs.map +1 -0
  40. package/lib/utils/trackingIngest.d.cts +14 -0
  41. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  42. package/lib/utils/vastMacros.cjs.map +1 -1
  43. package/lib/utils/vastTrackingMacros.cjs.map +1 -1
  44. package/package.json +1 -3
  45. package/lib/utils/mqttClient.cjs +0 -305
  46. package/lib/utils/mqttClient.cjs.map +0 -1
  47. package/lib/utils/mqttClient.d.cts +0 -13
  48. package/lib/utils/mqttConfig.cjs +0 -139
  49. package/lib/utils/mqttConfig.cjs.map +0 -1
  50. package/lib/utils/mqttConfig.d.cts +0 -20
  51. package/src/certs/emqxsl-ca.crt +0 -22
@@ -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/mqttConfig.ts
245
- var DEFAULT_MQTT_CONFIG = {
232
+ // src/utils/trackingIngest.ts
233
+ var DEFAULT_TRACKING_INGEST_CONFIG = {
246
234
  enabled: true,
247
- brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
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 mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
256
- function isMQTTEnabled() {
257
- return mqttConfig.enabled;
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
- // src/utils/mqttClient.ts
267
- var import_mqtt = __toESM(require("mqtt"), 1);
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 scheduleReconnect() {
296
- if (stopped || !isMQTTEnabled() || reconnectTimer) return;
297
- if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
298
- console.warn("".concat(LOG, " giving up after ").concat(reconnectAttempts, " attempts; cooling down for ").concat(COOLDOWN_MS / 6e4, "m"));
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
- var delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * Math.pow(2, reconnectAttempts));
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 openConnection() {
317
- if (stopped || !isMQTTEnabled()) return;
318
- teardownClient();
319
- var url = buildMQTTBrokerUrl();
320
- status = "connecting";
321
- var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
322
- try {
323
- client = import_mqtt.default.connect(url, {
324
- clientId: clientId,
325
- username: mqttConfig.username,
326
- password: mqttConfig.password,
327
- keepalive: KEEPALIVE_SECONDS,
328
- clean: true,
329
- // Disable MQTT.js internal reconnect; we manage reconnection ourselves.
330
- reconnectPeriod: 0,
331
- connectTimeout: CONNECT_TIMEOUT_MS,
332
- queueQoSZero: false,
333
- reschedulePings: true,
334
- // Root-cause fix for the Tizen 4.0 "Keepalive timeout" loop: MQTT.js's
335
- // default timerVariant "auto" runs the keepalive interval inside a
336
- // Blob-URL Web Worker (via worker-timers). On Samsung Tizen 4.0 (old
337
- // WebKit) served from a file:// origin that worker can't tick reliably,
338
- // so the keepalive counter trips onKeepaliveTimeout almost immediately
339
- // after connect. Force the native setInterval timer instead; the main
340
- // thread is free because video is decoded by the native AVPlay pipeline.
341
- timerVariant: "native"
342
- });
343
- } catch (err) {
344
- status = "error";
345
- console.warn("".concat(LOG, " connect() threw:"), err);
346
- scheduleReconnect();
347
- return;
348
- }
349
- client.on("connect", function() {
350
- status = "connected";
351
- reconnectAttempts = 0;
352
- clearReconnectTimer();
353
- console.info("".concat(LOG, " connected to ").concat(url));
354
- });
355
- client.on("offline", function() {
356
- if (status === "connected") status = "disconnected";
357
- console.warn("".concat(LOG, " offline"));
358
- scheduleReconnect();
359
- });
360
- client.on("error", function(err) {
361
- status = "error";
362
- console.warn("".concat(LOG, " error:"), err.message);
363
- scheduleReconnect();
364
- });
365
- client.on("close", function() {
366
- if (status === "connected") status = "disconnected";
367
- scheduleReconnect();
368
- });
369
- }
370
- function initMQTTClient() {
371
- if (client || !isMQTTEnabled()) return;
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
- return true;
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(isMQTTEnabled() && licenseKey);
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
- 3,
1049
+ 4,
1143
1050
  ,
1144
- 4
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
- 3,
1162
- 4
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
- 4
1081
+ 5
1170
1082
  ];
1171
- case 4:
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
- 3,
1194
+ 5,
1283
1195
  ,
1284
- 4
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
- 3,
1307
- 4
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
- 4
1240
+ 6
1315
1241
  ];
1316
- case 4:
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
- 3,
1265
+ 4,
1340
1266
  ,
1341
- 4
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
- 3,
1352
- 4
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
- 4
1294
+ 5
1360
1295
  ];
1361
- case 4:
1296
+ case 5:
1362
1297
  return [
1363
1298
  2
1364
1299
  ];