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
@@ -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/mqttConfig.ts
288
- var DEFAULT_MQTT_CONFIG = {
275
+ // src/utils/trackingIngest.ts
276
+ var DEFAULT_TRACKING_INGEST_CONFIG = {
289
277
  enabled: true,
290
- brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
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 mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
299
- function isMQTTEnabled() {
300
- return mqttConfig.enabled;
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
- // src/utils/mqttClient.ts
310
- var import_mqtt = __toESM(require("mqtt"), 1);
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 scheduleReconnect() {
339
- if (stopped || !isMQTTEnabled() || reconnectTimer) return;
340
- if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
341
- console.warn("".concat(LOG, " giving up after ").concat(reconnectAttempts, " attempts; cooling down for ").concat(COOLDOWN_MS / 6e4, "m"));
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
- var delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * Math.pow(2, reconnectAttempts));
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 openConnection() {
360
- if (stopped || !isMQTTEnabled()) return;
361
- teardownClient();
362
- var url = buildMQTTBrokerUrl();
363
- status = "connecting";
364
- var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
365
- try {
366
- client = import_mqtt.default.connect(url, {
367
- clientId: clientId,
368
- username: mqttConfig.username,
369
- password: mqttConfig.password,
370
- keepalive: KEEPALIVE_SECONDS,
371
- clean: true,
372
- // Disable MQTT.js internal reconnect; we manage reconnection ourselves.
373
- reconnectPeriod: 0,
374
- connectTimeout: CONNECT_TIMEOUT_MS,
375
- queueQoSZero: false,
376
- reschedulePings: true,
377
- // Root-cause fix for the Tizen 4.0 "Keepalive timeout" loop: MQTT.js's
378
- // default timerVariant "auto" runs the keepalive interval inside a
379
- // Blob-URL Web Worker (via worker-timers). On Samsung Tizen 4.0 (old
380
- // WebKit) served from a file:// origin that worker can't tick reliably,
381
- // so the keepalive counter trips onKeepaliveTimeout almost immediately
382
- // after connect. Force the native setInterval timer instead; the main
383
- // thread is free because video is decoded by the native AVPlay pipeline.
384
- timerVariant: "native"
385
- });
386
- } catch (err) {
387
- status = "error";
388
- console.warn("".concat(LOG, " connect() threw:"), err);
389
- scheduleReconnect();
390
- return;
391
- }
392
- client.on("connect", function() {
393
- status = "connected";
394
- reconnectAttempts = 0;
395
- clearReconnectTimer();
396
- console.info("".concat(LOG, " connected to ").concat(url));
397
- });
398
- client.on("offline", function() {
399
- if (status === "connected") status = "disconnected";
400
- console.warn("".concat(LOG, " offline"));
401
- scheduleReconnect();
402
- });
403
- client.on("error", function(err) {
404
- status = "error";
405
- console.warn("".concat(LOG, " error:"), err.message);
406
- scheduleReconnect();
407
- });
408
- client.on("close", function() {
409
- if (status === "connected") status = "disconnected";
410
- scheduleReconnect();
411
- });
412
- }
413
- function initMQTTClient() {
414
- if (client || !isMQTTEnabled()) return;
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
- return true;
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(isMQTTEnabled() && licenseKey);
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
- 3,
1136
+ 5,
1230
1137
  ,
1231
- 4
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
- 3,
1254
- 4
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
- 4
1182
+ 6
1262
1183
  ];
1263
- case 4:
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
- 3,
1207
+ 4,
1287
1208
  ,
1288
- 4
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
- 3,
1299
- 4
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
- 4
1236
+ 5
1307
1237
  ];
1308
- case 4:
1238
+ case 5:
1309
1239
  return [
1310
1240
  2
1311
1241
  ];