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
@@ -2501,163 +2501,83 @@ function createPalNonceManager() {
2501
2501
  }
2502
2502
  };
2503
2503
  }
2504
- // src/utils/mqttConfig.ts
2505
- var DEFAULT_MQTT_CONFIG = {
2504
+ // src/utils/trackingIngest.ts
2505
+ var DEFAULT_TRACKING_INGEST_CONFIG = {
2506
2506
  enabled: true,
2507
- brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
2508
- brokerPort: 8883,
2509
- wsPort: 8084,
2510
- username: "for-sonifi",
2511
- password: "sonifi-mqtt",
2512
- topicPrefix: "adstorm/players",
2513
- qos: 1
2507
+ baseUrl: "https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking"
2514
2508
  };
2515
- var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
2516
- function applyMQTTConfig(overrides) {
2517
- Object.assign(mqttConfig, overrides);
2518
- }
2519
- function isMQTTEnabled() {
2520
- return mqttConfig.enabled;
2521
- }
2522
- function buildMQTTBrokerUrl() {
2523
- if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
2524
- return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
2525
- }
2526
- function buildPlayerTopic(licenseKey, channel) {
2527
- return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
2528
- }
2529
- // src/utils/mqttClient.ts
2530
- var import_mqtt = __toESM(require("mqtt"), 1);
2531
- var LOG = "[StormcloudVideoPlayer][MQTT]";
2532
- var KEEPALIVE_SECONDS = 30;
2533
- var CONNECT_TIMEOUT_MS = 1e4;
2534
- var RECONNECT_BASE_MS = 5e3;
2535
- var RECONNECT_MAX_MS = 6e4;
2536
- var MAX_RECONNECT_ATTEMPTS = 8;
2537
- var COOLDOWN_MS = 10 * 6e4;
2538
- var client = null;
2539
- var status = "disconnected";
2540
- var reconnectAttempts = 0;
2541
- var reconnectTimer = null;
2542
- var stopped = false;
2543
- function clearReconnectTimer() {
2544
- if (reconnectTimer) {
2545
- clearTimeout(reconnectTimer);
2546
- reconnectTimer = null;
2547
- }
2548
- }
2549
- function teardownClient() {
2550
- if (client) {
2551
- try {
2552
- client.removeAllListeners();
2553
- client.end(true);
2554
- } catch (unused) {}
2555
- client = null;
2556
- }
2557
- }
2558
- function scheduleReconnect() {
2559
- if (stopped || !isMQTTEnabled() || reconnectTimer) return;
2560
- if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
2561
- console.warn("".concat(LOG, " giving up after ").concat(reconnectAttempts, " attempts; cooling down for ").concat(COOLDOWN_MS / 6e4, "m"));
2562
- teardownClient();
2563
- status = "disconnected";
2564
- reconnectTimer = setTimeout(function() {
2565
- reconnectTimer = null;
2566
- reconnectAttempts = 0;
2567
- openConnection();
2568
- }, COOLDOWN_MS);
2569
- return;
2570
- }
2571
- var delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * Math.pow(2, reconnectAttempts));
2572
- var jitter = Math.floor(Math.random() * 1e3);
2573
- reconnectAttempts += 1;
2574
- reconnectTimer = setTimeout(function() {
2575
- reconnectTimer = null;
2576
- openConnection();
2577
- }, delay + jitter);
2578
- }
2579
- function openConnection() {
2580
- if (stopped || !isMQTTEnabled()) return;
2581
- teardownClient();
2582
- var url = buildMQTTBrokerUrl();
2583
- status = "connecting";
2584
- var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
2585
- try {
2586
- client = import_mqtt.default.connect(url, {
2587
- clientId: clientId,
2588
- username: mqttConfig.username,
2589
- password: mqttConfig.password,
2590
- keepalive: KEEPALIVE_SECONDS,
2591
- clean: true,
2592
- // Disable MQTT.js internal reconnect; we manage reconnection ourselves.
2593
- reconnectPeriod: 0,
2594
- connectTimeout: CONNECT_TIMEOUT_MS,
2595
- queueQoSZero: false,
2596
- reschedulePings: true,
2597
- // Root-cause fix for the Tizen 4.0 "Keepalive timeout" loop: MQTT.js's
2598
- // default timerVariant "auto" runs the keepalive interval inside a
2599
- // Blob-URL Web Worker (via worker-timers). On Samsung Tizen 4.0 (old
2600
- // WebKit) served from a file:// origin that worker can't tick reliably,
2601
- // so the keepalive counter trips onKeepaliveTimeout almost immediately
2602
- // after connect. Force the native setInterval timer instead; the main
2603
- // thread is free because video is decoded by the native AVPlay pipeline.
2604
- timerVariant: "native"
2605
- });
2606
- } catch (err) {
2607
- status = "error";
2608
- console.warn("".concat(LOG, " connect() threw:"), err);
2609
- scheduleReconnect();
2610
- return;
2611
- }
2612
- client.on("connect", function() {
2613
- status = "connected";
2614
- reconnectAttempts = 0;
2615
- clearReconnectTimer();
2616
- console.info("".concat(LOG, " connected to ").concat(url));
2617
- });
2618
- client.on("offline", function() {
2619
- if (status === "connected") status = "disconnected";
2620
- console.warn("".concat(LOG, " offline"));
2621
- scheduleReconnect();
2622
- });
2623
- client.on("error", function(err) {
2624
- status = "error";
2625
- console.warn("".concat(LOG, " error:"), err.message);
2626
- scheduleReconnect();
2627
- });
2628
- client.on("close", function() {
2629
- if (status === "connected") status = "disconnected";
2630
- scheduleReconnect();
2631
- });
2509
+ var trackingIngestConfig = _object_spread({}, DEFAULT_TRACKING_INGEST_CONFIG);
2510
+ function isTrackingIngestEnabled() {
2511
+ return trackingIngestConfig.enabled === true;
2632
2512
  }
2633
- function initMQTTClient() {
2634
- if (client || !isMQTTEnabled()) return;
2635
- stopped = false;
2636
- reconnectAttempts = 0;
2637
- openConnection();
2513
+ function normalizeIngestBaseUrl(baseUrl) {
2514
+ return baseUrl.replace(/\/+$/, "");
2638
2515
  }
2639
- function ensureMQTTClient() {
2640
- if (isMQTTEnabled() && !client && !reconnectTimer) {
2641
- initMQTTClient();
2516
+ function buildTrackingIngestUrl(channel) {
2517
+ var base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);
2518
+ if (channel === "impressions") {
2519
+ return "".concat(base, "/impressions/ingest");
2642
2520
  }
2521
+ return "".concat(base, "/metrics/ingest");
2643
2522
  }
2644
- function publishMQTT(topic, payload) {
2645
- if (!isMQTTEnabled()) {
2646
- return false;
2647
- }
2648
- ensureMQTTClient();
2649
- if (!client || !client.connected) {
2650
- return false;
2651
- }
2652
- try {
2653
- client.publish(topic, JSON.stringify(payload), {
2654
- qos: mqttConfig.qos
2523
+ function ingestPlayerTracking(licenseKey, channel, body) {
2524
+ return _async_to_generator(function() {
2525
+ var response, error;
2526
+ return _ts_generator(this, function(_state) {
2527
+ switch(_state.label){
2528
+ case 0:
2529
+ if (!isTrackingIngestEnabled() || !licenseKey) {
2530
+ return [
2531
+ 2,
2532
+ false
2533
+ ];
2534
+ }
2535
+ _state.label = 1;
2536
+ case 1:
2537
+ _state.trys.push([
2538
+ 1,
2539
+ 3,
2540
+ ,
2541
+ 4
2542
+ ]);
2543
+ return [
2544
+ 4,
2545
+ fetch(buildTrackingIngestUrl(channel), {
2546
+ method: "POST",
2547
+ headers: {
2548
+ "Content-Type": "application/json",
2549
+ Authorization: "License-Key ".concat(licenseKey)
2550
+ },
2551
+ body: JSON.stringify(body)
2552
+ })
2553
+ ];
2554
+ case 2:
2555
+ response = _state.sent();
2556
+ if (!response.ok) {
2557
+ console.warn("[StormcloudVideoPlayer] Tracking ingest failed (".concat(response.status, ") for ").concat(channel));
2558
+ return [
2559
+ 2,
2560
+ false
2561
+ ];
2562
+ }
2563
+ return [
2564
+ 2,
2565
+ true
2566
+ ];
2567
+ case 3:
2568
+ error = _state.sent();
2569
+ console.warn("[StormcloudVideoPlayer] Tracking ingest error for ".concat(channel, ":"), error);
2570
+ return [
2571
+ 2,
2572
+ false
2573
+ ];
2574
+ case 4:
2575
+ return [
2576
+ 2
2577
+ ];
2578
+ }
2655
2579
  });
2656
- return true;
2657
- } catch (err) {
2658
- console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
2659
- return false;
2660
- }
2580
+ })();
2661
2581
  }
2662
2582
  // src/utils/vastEnvironmentSignals.ts
2663
2583
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
@@ -3428,7 +3348,7 @@ function getBrowserID(clientInfo) {
3428
3348
  })();
3429
3349
  }
3430
3350
  function canPublish(licenseKey) {
3431
- return Boolean(isMQTTEnabled() && licenseKey);
3351
+ return Boolean(isTrackingIngestEnabled() && licenseKey);
3432
3352
  }
3433
3353
  function buildPlayerMetricEvent() {
3434
3354
  return _async_to_generator(function() {
@@ -3470,10 +3390,6 @@ function buildPlayerMetricEvent() {
3470
3390
  });
3471
3391
  }).apply(this, arguments);
3472
3392
  }
3473
- function publishTracking(licenseKey, channel, body) {
3474
- ensureMQTTClient();
3475
- publishMQTT(buildPlayerTopic(licenseKey, channel), body);
3476
- }
3477
3393
  function sendInitialTracking(_0) {
3478
3394
  return _async_to_generator(function(licenseKey) {
3479
3395
  var context, metricEvent, error;
@@ -3489,9 +3405,9 @@ function sendInitialTracking(_0) {
3489
3405
  case 1:
3490
3406
  _state.trys.push([
3491
3407
  1,
3492
- 3,
3408
+ 4,
3493
3409
  ,
3494
- 4
3410
+ 5
3495
3411
  ]);
3496
3412
  return [
3497
3413
  4,
@@ -3502,23 +3418,28 @@ function sendInitialTracking(_0) {
3502
3418
  ];
3503
3419
  case 2:
3504
3420
  metricEvent = _state.sent();
3505
- publishTracking(licenseKey, "metrics", {
3506
- events: [
3507
- metricEvent
3508
- ]
3509
- });
3510
3421
  return [
3511
- 3,
3512
- 4
3422
+ 4,
3423
+ ingestPlayerTracking(licenseKey, "metrics", {
3424
+ events: [
3425
+ metricEvent
3426
+ ]
3427
+ })
3513
3428
  ];
3514
3429
  case 3:
3430
+ _state.sent();
3431
+ return [
3432
+ 3,
3433
+ 5
3434
+ ];
3435
+ case 4:
3515
3436
  error = _state.sent();
3516
3437
  console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
3517
3438
  return [
3518
3439
  3,
3519
- 4
3440
+ 5
3520
3441
  ];
3521
- case 4:
3442
+ case 5:
3522
3443
  return [
3523
3444
  2
3524
3445
  ];
@@ -3629,9 +3550,9 @@ function sendAdImpressionTracking(_0, _1) {
3629
3550
  case 1:
3630
3551
  _state.trys.push([
3631
3552
  1,
3632
- 3,
3553
+ 5,
3633
3554
  ,
3634
- 4
3555
+ 6
3635
3556
  ]);
3636
3557
  return [
3637
3558
  4,
@@ -3641,29 +3562,43 @@ function sendAdImpressionTracking(_0, _1) {
3641
3562
  ];
3642
3563
  case 2:
3643
3564
  metricEvent = _state.sent();
3644
- publishTracking(licenseKey, "heartbeat", metricEvent);
3645
- publishTracking(licenseKey, "impressions", {
3646
- events: [
3647
- {
3648
- player_id: metricEvent.player_id,
3649
- ad_played_count: 1,
3650
- ad_url: adImpressionInfo.adUrl,
3651
- capture_at: adImpressionInfo.timestamp
3652
- }
3653
- ]
3654
- });
3655
3565
  return [
3656
- 3,
3657
- 4
3566
+ 4,
3567
+ ingestPlayerTracking(licenseKey, "metrics", {
3568
+ events: [
3569
+ metricEvent
3570
+ ]
3571
+ })
3658
3572
  ];
3659
3573
  case 3:
3574
+ _state.sent();
3575
+ return [
3576
+ 4,
3577
+ ingestPlayerTracking(licenseKey, "impressions", {
3578
+ events: [
3579
+ {
3580
+ player_id: metricEvent.player_id,
3581
+ ad_played_count: 1,
3582
+ ad_url: adImpressionInfo.adUrl,
3583
+ capture_at: adImpressionInfo.timestamp
3584
+ }
3585
+ ]
3586
+ })
3587
+ ];
3588
+ case 4:
3589
+ _state.sent();
3590
+ return [
3591
+ 3,
3592
+ 6
3593
+ ];
3594
+ case 5:
3660
3595
  error = _state.sent();
3661
3596
  console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
3662
3597
  return [
3663
3598
  3,
3664
- 4
3599
+ 6
3665
3600
  ];
3666
- case 4:
3601
+ case 6:
3667
3602
  return [
3668
3603
  2
3669
3604
  ];
@@ -3686,9 +3621,9 @@ function sendHeartbeat(_0) {
3686
3621
  case 1:
3687
3622
  _state.trys.push([
3688
3623
  1,
3689
- 3,
3624
+ 4,
3690
3625
  ,
3691
- 4
3626
+ 5
3692
3627
  ]);
3693
3628
  return [
3694
3629
  4,
@@ -3696,19 +3631,28 @@ function sendHeartbeat(_0) {
3696
3631
  ];
3697
3632
  case 2:
3698
3633
  heartbeatData = _state.sent();
3699
- publishTracking(licenseKey, "heartbeat", heartbeatData);
3700
3634
  return [
3701
- 3,
3702
- 4
3635
+ 4,
3636
+ ingestPlayerTracking(licenseKey, "metrics", {
3637
+ events: [
3638
+ heartbeatData
3639
+ ]
3640
+ })
3703
3641
  ];
3704
3642
  case 3:
3643
+ _state.sent();
3644
+ return [
3645
+ 3,
3646
+ 5
3647
+ ];
3648
+ case 4:
3705
3649
  error = _state.sent();
3706
3650
  console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
3707
3651
  return [
3708
3652
  3,
3709
- 4
3653
+ 5
3710
3654
  ];
3711
- case 4:
3655
+ case 5:
3712
3656
  return [
3713
3657
  2
3714
3658
  ];
@@ -5582,7 +5526,6 @@ var AdConfigManager = /*#__PURE__*/ function() {
5582
5526
  ];
5583
5527
  case 4:
5584
5528
  data = _state.sent();
5585
- this.applyMqttConfigFromResponse(data);
5586
5529
  imaPayload = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : (_data_response_ima = _data_response.ima) === null || _data_response_ima === void 0 ? void 0 : (_data_response_ima_publisherdeskima = _data_response_ima["publisherdesk.ima"]) === null || _data_response_ima_publisherdeskima === void 0 ? void 0 : _data_response_ima_publisherdeskima.payload;
5587
5530
  if (imaPayload) {
5588
5531
  decodedPayload = imaPayload;
@@ -5616,20 +5559,6 @@ var AdConfigManager = /*#__PURE__*/ function() {
5616
5559
  }).call(this);
5617
5560
  }
5618
5561
  },
5619
- {
5620
- key: "applyMqttConfigFromResponse",
5621
- value: function applyMqttConfigFromResponse(data) {
5622
- var _data_response;
5623
- var mqttConfig2 = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : _data_response.mqtt_config;
5624
- if (!mqttConfig2 || (typeof mqttConfig2 === "undefined" ? "undefined" : _type_of(mqttConfig2)) !== "object") {
5625
- return;
5626
- }
5627
- applyMQTTConfig(mqttConfig2);
5628
- if (this.debug) {
5629
- console.log("[StormcloudVideoPlayer] Applied MQTT config from /ads/web:", mqttConfig2);
5630
- }
5631
- }
5632
- },
5633
5562
  {
5634
5563
  key: "fetchAndParseVmap",
5635
5564
  value: function fetchAndParseVmap(vmapUrl) {