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
package/lib/index.d.cts CHANGED
@@ -2,25 +2,6 @@ import React, { CSSProperties, lazy as lazy$1 } from 'react';
2
2
  import * as csstype from 'csstype';
3
3
  import Hls from 'hls.js';
4
4
 
5
- declare const MQTT_CA_CERT_FILE = "src/certs/emqxsl-ca.crt";
6
- type MQTTConfig = {
7
- enabled: boolean;
8
- brokerAddress: string;
9
- brokerPort: number;
10
- wsPort: number;
11
- username: string;
12
- password: string;
13
- topicPrefix: string;
14
- qos: 0 | 1 | 2;
15
- brokerUrl?: string;
16
- };
17
- declare const DEFAULT_MQTT_CONFIG: MQTTConfig;
18
- declare const mqttConfig: MQTTConfig;
19
- declare function applyMQTTConfig(overrides: Partial<MQTTConfig>): void;
20
- declare function isMQTTEnabled(): boolean;
21
- declare function buildMQTTBrokerUrl(): string;
22
- declare function buildPlayerTopic(licenseKey: string, channel: "metrics" | "impressions" | "heartbeat"): string;
23
-
24
5
  type LateJoinPolicy = "play_remaining" | "skip_to_content";
25
6
  interface AdBreak {
26
7
  id?: string;
@@ -3964,15 +3945,17 @@ declare function sendAdLoadedTracking(licenseKey: string | undefined, adLoadedIn
3964
3945
  declare function sendAdImpressionTracking(licenseKey: string | undefined, adImpressionInfo: AdImpressionInfo, context?: PlayerAnalyticsContext): Promise<void>;
3965
3946
  declare function sendHeartbeat(licenseKey?: string, context?: PlayerAnalyticsContext, flags?: PlayerMetricFlags): Promise<void>;
3966
3947
 
3967
- type MQTTStatus = "disconnected" | "connecting" | "connected" | "error";
3968
- declare function getMQTTStatus(): MQTTStatus;
3969
- declare function isMQTTConnected(): boolean;
3970
- declare function isMQTTConfigured(): boolean;
3971
- declare function configureMQTT(overrides: Partial<MQTTConfig>): void;
3972
- declare function initMQTTClient(): void;
3973
- declare function ensureMQTTClient(): void;
3974
- declare function publishMQTT(topic: string, payload: Record<string, unknown>): boolean;
3975
- declare function disconnectMQTT(): void;
3948
+ type TrackingIngestChannel = "metrics" | "impressions" | "heartbeat";
3949
+ type TrackingIngestConfig = {
3950
+ enabled: boolean;
3951
+ baseUrl: string;
3952
+ };
3953
+ declare const DEFAULT_TRACKING_INGEST_CONFIG: TrackingIngestConfig;
3954
+ declare const trackingIngestConfig: TrackingIngestConfig;
3955
+ declare function applyTrackingIngestConfig(overrides: Partial<TrackingIngestConfig>): void;
3956
+ declare function configureTrackingIngest(overrides: Partial<TrackingIngestConfig>): void;
3957
+ declare function isTrackingIngestEnabled(): boolean;
3958
+ declare function ingestPlayerTracking(licenseKey: string, channel: TrackingIngestChannel, body: Record<string, unknown>): Promise<boolean>;
3976
3959
 
3977
3960
  declare function initializePolyfills(): void;
3978
3961
 
@@ -4045,4 +4028,4 @@ interface PalNonceManager {
4045
4028
  }
4046
4029
  declare function createPalNonceManager(): PalNonceManager;
4047
4030
 
4048
- export { type AdBreak, type AdController, type AdControllerOptions, type AdDetectInfo, type AdImpressionInfo, type AdLoadedInfo, type AdSchedule, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, DEFAULT_MQTT_CONFIG, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type ImaController, type ImaControllerOptions, type LateJoinPolicy, type MQTTConfig, type MQTTStatus, MQTT_CA_CERT_FILE, type OnProgressProps, type PalNonceManager, type PalNonceOptions, type PlayerAnalyticsContext, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type TrackingData, applyMQTTConfig, buildAnalyticsContext, buildMQTTBrokerUrl, buildPlayerTopic, canPlay, configureMQTT, createHlsAdPlayer, createPalNonceManager, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, disconnectMQTT, ensureMQTTClient, getBrowserConfigOverrides, getBrowserID, getClientInfo, getMQTTStatus, initMQTTClient, initializePolyfills, isMQTTConfigured, isMQTTConnected, isMQTTEnabled, isMediaStream, lazy, logBrowserInfo, merge, mqttConfig, omit, parseQuery, players, publishMQTT, randomString, requiresMediaPipelineResetAfterAds, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode };
4031
+ export { type AdBreak, type AdController, type AdControllerOptions, type AdDetectInfo, type AdImpressionInfo, type AdLoadedInfo, type AdSchedule, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, DEFAULT_TRACKING_INGEST_CONFIG, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type ImaController, type ImaControllerOptions, type LateJoinPolicy, type OnProgressProps, type PalNonceManager, type PalNonceOptions, type PlayerAnalyticsContext, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type TrackingData, type TrackingIngestChannel, type TrackingIngestConfig, applyTrackingIngestConfig, buildAnalyticsContext, canPlay, configureTrackingIngest, createHlsAdPlayer, createPalNonceManager, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, getBrowserConfigOverrides, getBrowserID, getClientInfo, ingestPlayerTracking, initializePolyfills, isMediaStream, isTrackingIngestEnabled, lazy, logBrowserInfo, merge, omit, parseQuery, players, randomString, requiresMediaPipelineResetAfterAds, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, trackingIngestConfig };
package/lib/index.d.ts CHANGED
@@ -2,25 +2,6 @@ import React, { CSSProperties, lazy as lazy$1 } from 'react';
2
2
  import * as csstype from 'csstype';
3
3
  import Hls from 'hls.js';
4
4
 
5
- declare const MQTT_CA_CERT_FILE = "src/certs/emqxsl-ca.crt";
6
- type MQTTConfig = {
7
- enabled: boolean;
8
- brokerAddress: string;
9
- brokerPort: number;
10
- wsPort: number;
11
- username: string;
12
- password: string;
13
- topicPrefix: string;
14
- qos: 0 | 1 | 2;
15
- brokerUrl?: string;
16
- };
17
- declare const DEFAULT_MQTT_CONFIG: MQTTConfig;
18
- declare const mqttConfig: MQTTConfig;
19
- declare function applyMQTTConfig(overrides: Partial<MQTTConfig>): void;
20
- declare function isMQTTEnabled(): boolean;
21
- declare function buildMQTTBrokerUrl(): string;
22
- declare function buildPlayerTopic(licenseKey: string, channel: "metrics" | "impressions" | "heartbeat"): string;
23
-
24
5
  type LateJoinPolicy = "play_remaining" | "skip_to_content";
25
6
  interface AdBreak {
26
7
  id?: string;
@@ -3964,15 +3945,17 @@ declare function sendAdLoadedTracking(licenseKey: string | undefined, adLoadedIn
3964
3945
  declare function sendAdImpressionTracking(licenseKey: string | undefined, adImpressionInfo: AdImpressionInfo, context?: PlayerAnalyticsContext): Promise<void>;
3965
3946
  declare function sendHeartbeat(licenseKey?: string, context?: PlayerAnalyticsContext, flags?: PlayerMetricFlags): Promise<void>;
3966
3947
 
3967
- type MQTTStatus = "disconnected" | "connecting" | "connected" | "error";
3968
- declare function getMQTTStatus(): MQTTStatus;
3969
- declare function isMQTTConnected(): boolean;
3970
- declare function isMQTTConfigured(): boolean;
3971
- declare function configureMQTT(overrides: Partial<MQTTConfig>): void;
3972
- declare function initMQTTClient(): void;
3973
- declare function ensureMQTTClient(): void;
3974
- declare function publishMQTT(topic: string, payload: Record<string, unknown>): boolean;
3975
- declare function disconnectMQTT(): void;
3948
+ type TrackingIngestChannel = "metrics" | "impressions" | "heartbeat";
3949
+ type TrackingIngestConfig = {
3950
+ enabled: boolean;
3951
+ baseUrl: string;
3952
+ };
3953
+ declare const DEFAULT_TRACKING_INGEST_CONFIG: TrackingIngestConfig;
3954
+ declare const trackingIngestConfig: TrackingIngestConfig;
3955
+ declare function applyTrackingIngestConfig(overrides: Partial<TrackingIngestConfig>): void;
3956
+ declare function configureTrackingIngest(overrides: Partial<TrackingIngestConfig>): void;
3957
+ declare function isTrackingIngestEnabled(): boolean;
3958
+ declare function ingestPlayerTracking(licenseKey: string, channel: TrackingIngestChannel, body: Record<string, unknown>): Promise<boolean>;
3976
3959
 
3977
3960
  declare function initializePolyfills(): void;
3978
3961
 
@@ -4045,4 +4028,4 @@ interface PalNonceManager {
4045
4028
  }
4046
4029
  declare function createPalNonceManager(): PalNonceManager;
4047
4030
 
4048
- export { type AdBreak, type AdController, type AdControllerOptions, type AdDetectInfo, type AdImpressionInfo, type AdLoadedInfo, type AdSchedule, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, DEFAULT_MQTT_CONFIG, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type ImaController, type ImaControllerOptions, type LateJoinPolicy, type MQTTConfig, type MQTTStatus, MQTT_CA_CERT_FILE, type OnProgressProps, type PalNonceManager, type PalNonceOptions, type PlayerAnalyticsContext, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type TrackingData, applyMQTTConfig, buildAnalyticsContext, buildMQTTBrokerUrl, buildPlayerTopic, canPlay, configureMQTT, createHlsAdPlayer, createPalNonceManager, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, disconnectMQTT, ensureMQTTClient, getBrowserConfigOverrides, getBrowserID, getClientInfo, getMQTTStatus, initMQTTClient, initializePolyfills, isMQTTConfigured, isMQTTConnected, isMQTTEnabled, isMediaStream, lazy, logBrowserInfo, merge, mqttConfig, omit, parseQuery, players, publishMQTT, randomString, requiresMediaPipelineResetAfterAds, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode };
4031
+ export { type AdBreak, type AdController, type AdControllerOptions, type AdDetectInfo, type AdImpressionInfo, type AdLoadedInfo, type AdSchedule, type BaseStormcloudPlayerProps, type BrowserInfo, type ClientInfo, DEFAULT_TRACKING_INGEST_CONFIG, type HeartbeatData, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, type ImaController, type ImaControllerOptions, type LateJoinPolicy, type OnProgressProps, type PalNonceManager, type PalNonceOptions, type PlayerAnalyticsContext, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, type StormcloudVideoPlayerConfig, type StormcloudVideoPlayerProps, type TrackingData, type TrackingIngestChannel, type TrackingIngestConfig, applyTrackingIngestConfig, buildAnalyticsContext, canPlay, configureTrackingIngest, createHlsAdPlayer, createPalNonceManager, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, getBrowserConfigOverrides, getBrowserID, getClientInfo, ingestPlayerTracking, initializePolyfills, isMediaStream, isTrackingIngestEnabled, lazy, logBrowserInfo, merge, omit, parseQuery, players, randomString, requiresMediaPipelineResetAfterAds, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, trackingIngestConfig };
package/lib/index.js CHANGED
@@ -2458,184 +2458,89 @@ function createPalNonceManager() {
2458
2458
  }
2459
2459
  };
2460
2460
  }
2461
- // src/utils/mqttConfig.ts
2462
- var MQTT_CA_CERT_FILE = "src/certs/emqxsl-ca.crt";
2463
- var DEFAULT_MQTT_CONFIG = {
2461
+ // src/utils/trackingIngest.ts
2462
+ var DEFAULT_TRACKING_INGEST_CONFIG = {
2464
2463
  enabled: true,
2465
- brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
2466
- brokerPort: 8883,
2467
- wsPort: 8084,
2468
- username: "for-sonifi",
2469
- password: "sonifi-mqtt",
2470
- topicPrefix: "adstorm/players",
2471
- qos: 1
2464
+ baseUrl: "https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking"
2472
2465
  };
2473
- var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
2474
- function applyMQTTConfig(overrides) {
2475
- Object.assign(mqttConfig, overrides);
2476
- }
2477
- function isMQTTEnabled() {
2478
- return mqttConfig.enabled;
2479
- }
2480
- function buildMQTTBrokerUrl() {
2481
- if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
2482
- return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
2483
- }
2484
- function buildPlayerTopic(licenseKey, channel) {
2485
- return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
2486
- }
2487
- // src/utils/mqttClient.ts
2488
- import mqtt from "mqtt";
2489
- var LOG = "[StormcloudVideoPlayer][MQTT]";
2490
- var KEEPALIVE_SECONDS = 30;
2491
- var CONNECT_TIMEOUT_MS = 1e4;
2492
- var RECONNECT_BASE_MS = 5e3;
2493
- var RECONNECT_MAX_MS = 6e4;
2494
- var MAX_RECONNECT_ATTEMPTS = 8;
2495
- var COOLDOWN_MS = 10 * 6e4;
2496
- var client = null;
2497
- var status = "disconnected";
2498
- var reconnectAttempts = 0;
2499
- var reconnectTimer = null;
2500
- var stopped = false;
2501
- function getMQTTStatus() {
2502
- return status;
2503
- }
2504
- function isMQTTConnected() {
2505
- return status === "connected" && client !== null && client.connected;
2506
- }
2507
- function isMQTTConfigured() {
2508
- return isMQTTEnabled();
2509
- }
2510
- function configureMQTT(overrides) {
2511
- applyMQTTConfig(overrides);
2512
- disconnectMQTT();
2513
- }
2514
- function clearReconnectTimer() {
2515
- if (reconnectTimer) {
2516
- clearTimeout(reconnectTimer);
2517
- reconnectTimer = null;
2518
- }
2519
- }
2520
- function teardownClient() {
2521
- if (client) {
2522
- try {
2523
- client.removeAllListeners();
2524
- client.end(true);
2525
- } catch (unused) {}
2526
- client = null;
2527
- }
2528
- }
2529
- function scheduleReconnect() {
2530
- if (stopped || !isMQTTEnabled() || reconnectTimer) return;
2531
- if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
2532
- console.warn("".concat(LOG, " giving up after ").concat(reconnectAttempts, " attempts; cooling down for ").concat(COOLDOWN_MS / 6e4, "m"));
2533
- teardownClient();
2534
- status = "disconnected";
2535
- reconnectTimer = setTimeout(function() {
2536
- reconnectTimer = null;
2537
- reconnectAttempts = 0;
2538
- openConnection();
2539
- }, COOLDOWN_MS);
2540
- return;
2541
- }
2542
- var delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * Math.pow(2, reconnectAttempts));
2543
- var jitter = Math.floor(Math.random() * 1e3);
2544
- reconnectAttempts += 1;
2545
- reconnectTimer = setTimeout(function() {
2546
- reconnectTimer = null;
2547
- openConnection();
2548
- }, delay + jitter);
2549
- }
2550
- function openConnection() {
2551
- if (stopped || !isMQTTEnabled()) return;
2552
- teardownClient();
2553
- var url = buildMQTTBrokerUrl();
2554
- status = "connecting";
2555
- var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
2556
- try {
2557
- client = mqtt.connect(url, {
2558
- clientId: clientId,
2559
- username: mqttConfig.username,
2560
- password: mqttConfig.password,
2561
- keepalive: KEEPALIVE_SECONDS,
2562
- clean: true,
2563
- // Disable MQTT.js internal reconnect; we manage reconnection ourselves.
2564
- reconnectPeriod: 0,
2565
- connectTimeout: CONNECT_TIMEOUT_MS,
2566
- queueQoSZero: false,
2567
- reschedulePings: true,
2568
- // Root-cause fix for the Tizen 4.0 "Keepalive timeout" loop: MQTT.js's
2569
- // default timerVariant "auto" runs the keepalive interval inside a
2570
- // Blob-URL Web Worker (via worker-timers). On Samsung Tizen 4.0 (old
2571
- // WebKit) served from a file:// origin that worker can't tick reliably,
2572
- // so the keepalive counter trips onKeepaliveTimeout almost immediately
2573
- // after connect. Force the native setInterval timer instead; the main
2574
- // thread is free because video is decoded by the native AVPlay pipeline.
2575
- timerVariant: "native"
2576
- });
2577
- } catch (err) {
2578
- status = "error";
2579
- console.warn("".concat(LOG, " connect() threw:"), err);
2580
- scheduleReconnect();
2581
- return;
2582
- }
2583
- client.on("connect", function() {
2584
- status = "connected";
2585
- reconnectAttempts = 0;
2586
- clearReconnectTimer();
2587
- console.info("".concat(LOG, " connected to ").concat(url));
2588
- });
2589
- client.on("offline", function() {
2590
- if (status === "connected") status = "disconnected";
2591
- console.warn("".concat(LOG, " offline"));
2592
- scheduleReconnect();
2593
- });
2594
- client.on("error", function(err) {
2595
- status = "error";
2596
- console.warn("".concat(LOG, " error:"), err.message);
2597
- scheduleReconnect();
2598
- });
2599
- client.on("close", function() {
2600
- if (status === "connected") status = "disconnected";
2601
- scheduleReconnect();
2602
- });
2466
+ var trackingIngestConfig = _object_spread({}, DEFAULT_TRACKING_INGEST_CONFIG);
2467
+ function applyTrackingIngestConfig(overrides) {
2468
+ Object.assign(trackingIngestConfig, overrides);
2603
2469
  }
2604
- function initMQTTClient() {
2605
- if (client || !isMQTTEnabled()) return;
2606
- stopped = false;
2607
- reconnectAttempts = 0;
2608
- openConnection();
2470
+ function configureTrackingIngest(overrides) {
2471
+ applyTrackingIngestConfig(overrides);
2609
2472
  }
2610
- function ensureMQTTClient() {
2611
- if (isMQTTEnabled() && !client && !reconnectTimer) {
2612
- initMQTTClient();
2613
- }
2473
+ function isTrackingIngestEnabled() {
2474
+ return trackingIngestConfig.enabled === true;
2614
2475
  }
2615
- function publishMQTT(topic, payload) {
2616
- if (!isMQTTEnabled()) {
2617
- return false;
2618
- }
2619
- ensureMQTTClient();
2620
- if (!client || !client.connected) {
2621
- return false;
2622
- }
2623
- try {
2624
- client.publish(topic, JSON.stringify(payload), {
2625
- qos: mqttConfig.qos
2626
- });
2627
- return true;
2628
- } catch (err) {
2629
- console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
2630
- return false;
2476
+ function normalizeIngestBaseUrl(baseUrl) {
2477
+ return baseUrl.replace(/\/+$/, "");
2478
+ }
2479
+ function buildTrackingIngestUrl(channel) {
2480
+ var base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);
2481
+ if (channel === "impressions") {
2482
+ return "".concat(base, "/impressions/ingest");
2631
2483
  }
2484
+ return "".concat(base, "/metrics/ingest");
2632
2485
  }
2633
- function disconnectMQTT() {
2634
- stopped = true;
2635
- clearReconnectTimer();
2636
- teardownClient();
2637
- reconnectAttempts = 0;
2638
- status = "disconnected";
2486
+ function ingestPlayerTracking(licenseKey, channel, body) {
2487
+ return _async_to_generator(function() {
2488
+ var response, error;
2489
+ return _ts_generator(this, function(_state) {
2490
+ switch(_state.label){
2491
+ case 0:
2492
+ if (!isTrackingIngestEnabled() || !licenseKey) {
2493
+ return [
2494
+ 2,
2495
+ false
2496
+ ];
2497
+ }
2498
+ _state.label = 1;
2499
+ case 1:
2500
+ _state.trys.push([
2501
+ 1,
2502
+ 3,
2503
+ ,
2504
+ 4
2505
+ ]);
2506
+ return [
2507
+ 4,
2508
+ fetch(buildTrackingIngestUrl(channel), {
2509
+ method: "POST",
2510
+ headers: {
2511
+ "Content-Type": "application/json",
2512
+ Authorization: "License-Key ".concat(licenseKey)
2513
+ },
2514
+ body: JSON.stringify(body)
2515
+ })
2516
+ ];
2517
+ case 2:
2518
+ response = _state.sent();
2519
+ if (!response.ok) {
2520
+ console.warn("[StormcloudVideoPlayer] Tracking ingest failed (".concat(response.status, ") for ").concat(channel));
2521
+ return [
2522
+ 2,
2523
+ false
2524
+ ];
2525
+ }
2526
+ return [
2527
+ 2,
2528
+ true
2529
+ ];
2530
+ case 3:
2531
+ error = _state.sent();
2532
+ console.warn("[StormcloudVideoPlayer] Tracking ingest error for ".concat(channel, ":"), error);
2533
+ return [
2534
+ 2,
2535
+ false
2536
+ ];
2537
+ case 4:
2538
+ return [
2539
+ 2
2540
+ ];
2541
+ }
2542
+ });
2543
+ })();
2639
2544
  }
2640
2545
  // src/utils/vastEnvironmentSignals.ts
2641
2546
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
@@ -3406,7 +3311,7 @@ function getBrowserID(clientInfo) {
3406
3311
  })();
3407
3312
  }
3408
3313
  function canPublish(licenseKey) {
3409
- return Boolean(isMQTTEnabled() && licenseKey);
3314
+ return Boolean(isTrackingIngestEnabled() && licenseKey);
3410
3315
  }
3411
3316
  function buildPlayerMetricEvent() {
3412
3317
  return _async_to_generator(function() {
@@ -3448,10 +3353,6 @@ function buildPlayerMetricEvent() {
3448
3353
  });
3449
3354
  }).apply(this, arguments);
3450
3355
  }
3451
- function publishTracking(licenseKey, channel, body) {
3452
- ensureMQTTClient();
3453
- publishMQTT(buildPlayerTopic(licenseKey, channel), body);
3454
- }
3455
3356
  function sendInitialTracking(_0) {
3456
3357
  return _async_to_generator(function(licenseKey) {
3457
3358
  var context, metricEvent, error;
@@ -3467,9 +3368,9 @@ function sendInitialTracking(_0) {
3467
3368
  case 1:
3468
3369
  _state.trys.push([
3469
3370
  1,
3470
- 3,
3371
+ 4,
3471
3372
  ,
3472
- 4
3373
+ 5
3473
3374
  ]);
3474
3375
  return [
3475
3376
  4,
@@ -3480,23 +3381,28 @@ function sendInitialTracking(_0) {
3480
3381
  ];
3481
3382
  case 2:
3482
3383
  metricEvent = _state.sent();
3483
- publishTracking(licenseKey, "metrics", {
3484
- events: [
3485
- metricEvent
3486
- ]
3487
- });
3488
3384
  return [
3489
- 3,
3490
- 4
3385
+ 4,
3386
+ ingestPlayerTracking(licenseKey, "metrics", {
3387
+ events: [
3388
+ metricEvent
3389
+ ]
3390
+ })
3491
3391
  ];
3492
3392
  case 3:
3393
+ _state.sent();
3394
+ return [
3395
+ 3,
3396
+ 5
3397
+ ];
3398
+ case 4:
3493
3399
  error = _state.sent();
3494
3400
  console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
3495
3401
  return [
3496
3402
  3,
3497
- 4
3403
+ 5
3498
3404
  ];
3499
- case 4:
3405
+ case 5:
3500
3406
  return [
3501
3407
  2
3502
3408
  ];
@@ -3607,9 +3513,9 @@ function sendAdImpressionTracking(_0, _1) {
3607
3513
  case 1:
3608
3514
  _state.trys.push([
3609
3515
  1,
3610
- 3,
3516
+ 5,
3611
3517
  ,
3612
- 4
3518
+ 6
3613
3519
  ]);
3614
3520
  return [
3615
3521
  4,
@@ -3619,29 +3525,43 @@ function sendAdImpressionTracking(_0, _1) {
3619
3525
  ];
3620
3526
  case 2:
3621
3527
  metricEvent = _state.sent();
3622
- publishTracking(licenseKey, "heartbeat", metricEvent);
3623
- publishTracking(licenseKey, "impressions", {
3624
- events: [
3625
- {
3626
- player_id: metricEvent.player_id,
3627
- ad_played_count: 1,
3628
- ad_url: adImpressionInfo.adUrl,
3629
- capture_at: adImpressionInfo.timestamp
3630
- }
3631
- ]
3632
- });
3633
3528
  return [
3634
- 3,
3635
- 4
3529
+ 4,
3530
+ ingestPlayerTracking(licenseKey, "metrics", {
3531
+ events: [
3532
+ metricEvent
3533
+ ]
3534
+ })
3636
3535
  ];
3637
3536
  case 3:
3537
+ _state.sent();
3538
+ return [
3539
+ 4,
3540
+ ingestPlayerTracking(licenseKey, "impressions", {
3541
+ events: [
3542
+ {
3543
+ player_id: metricEvent.player_id,
3544
+ ad_played_count: 1,
3545
+ ad_url: adImpressionInfo.adUrl,
3546
+ capture_at: adImpressionInfo.timestamp
3547
+ }
3548
+ ]
3549
+ })
3550
+ ];
3551
+ case 4:
3552
+ _state.sent();
3553
+ return [
3554
+ 3,
3555
+ 6
3556
+ ];
3557
+ case 5:
3638
3558
  error = _state.sent();
3639
3559
  console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
3640
3560
  return [
3641
3561
  3,
3642
- 4
3562
+ 6
3643
3563
  ];
3644
- case 4:
3564
+ case 6:
3645
3565
  return [
3646
3566
  2
3647
3567
  ];
@@ -3664,9 +3584,9 @@ function sendHeartbeat(_0) {
3664
3584
  case 1:
3665
3585
  _state.trys.push([
3666
3586
  1,
3667
- 3,
3587
+ 4,
3668
3588
  ,
3669
- 4
3589
+ 5
3670
3590
  ]);
3671
3591
  return [
3672
3592
  4,
@@ -3674,19 +3594,28 @@ function sendHeartbeat(_0) {
3674
3594
  ];
3675
3595
  case 2:
3676
3596
  heartbeatData = _state.sent();
3677
- publishTracking(licenseKey, "heartbeat", heartbeatData);
3678
3597
  return [
3679
- 3,
3680
- 4
3598
+ 4,
3599
+ ingestPlayerTracking(licenseKey, "metrics", {
3600
+ events: [
3601
+ heartbeatData
3602
+ ]
3603
+ })
3681
3604
  ];
3682
3605
  case 3:
3606
+ _state.sent();
3607
+ return [
3608
+ 3,
3609
+ 5
3610
+ ];
3611
+ case 4:
3683
3612
  error = _state.sent();
3684
3613
  console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
3685
3614
  return [
3686
3615
  3,
3687
- 4
3616
+ 5
3688
3617
  ];
3689
- case 4:
3618
+ case 5:
3690
3619
  return [
3691
3620
  2
3692
3621
  ];
@@ -5565,7 +5494,6 @@ var AdConfigManager = /*#__PURE__*/ function() {
5565
5494
  ];
5566
5495
  case 4:
5567
5496
  data = _state.sent();
5568
- this.applyMqttConfigFromResponse(data);
5569
5497
  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;
5570
5498
  if (imaPayload) {
5571
5499
  decodedPayload = imaPayload;
@@ -5599,20 +5527,6 @@ var AdConfigManager = /*#__PURE__*/ function() {
5599
5527
  }).call(this);
5600
5528
  }
5601
5529
  },
5602
- {
5603
- key: "applyMqttConfigFromResponse",
5604
- value: function applyMqttConfigFromResponse(data) {
5605
- var _data_response;
5606
- var mqttConfig2 = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : _data_response.mqtt_config;
5607
- if (!mqttConfig2 || (typeof mqttConfig2 === "undefined" ? "undefined" : _type_of(mqttConfig2)) !== "object") {
5608
- return;
5609
- }
5610
- applyMQTTConfig(mqttConfig2);
5611
- if (this.debug) {
5612
- console.log("[StormcloudVideoPlayer] Applied MQTT config from /ads/web:", mqttConfig2);
5613
- }
5614
- }
5615
- },
5616
5530
  {
5617
5531
  key: "fetchAndParseVmap",
5618
5532
  value: function fetchAndParseVmap(vmapUrl) {
@@ -12323,5 +12237,5 @@ var createStormcloudPlayer = function createStormcloudPlayer(playerList, fallbac
12323
12237
  };
12324
12238
  var StormcloudPlayer = createStormcloudPlayer(players_default, players_default[players_default.length - 1]);
12325
12239
  var StormcloudPlayer_default = StormcloudPlayer;
12326
- export { DEFAULT_MQTT_CONFIG, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, MQTT_CA_CERT_FILE, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer_default as StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, applyMQTTConfig, buildAnalyticsContext, buildMQTTBrokerUrl, buildPlayerTopic, canPlay, configureMQTT, createHlsAdPlayer, createPalNonceManager, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, disconnectMQTT, ensureMQTTClient, getBrowserConfigOverrides, getBrowserID, getClientInfo, getMQTTStatus, initMQTTClient, initializePolyfills, isMQTTConfigured, isMQTTConnected, isMQTTEnabled, isMediaStream, lazy, logBrowserInfo, merge, mqttConfig, omit, parseQuery, players_default as players, publishMQTT, randomString, requiresMediaPipelineResetAfterAds, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode };
12240
+ export { DEFAULT_TRACKING_INGEST_CONFIG, IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer_default as StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, applyTrackingIngestConfig, buildAnalyticsContext, canPlay, configureTrackingIngest, createHlsAdPlayer, createPalNonceManager, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, getBrowserConfigOverrides, getBrowserID, getClientInfo, ingestPlayerTracking, initializePolyfills, isMediaStream, isTrackingIngestEnabled, lazy, logBrowserInfo, merge, omit, parseQuery, players_default as players, randomString, requiresMediaPipelineResetAfterAds, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode, trackingIngestConfig };
12327
12241
  //# sourceMappingURL=index.js.map