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/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
|
|
3968
|
-
|
|
3969
|
-
|
|
3970
|
-
|
|
3971
|
-
|
|
3972
|
-
declare
|
|
3973
|
-
declare
|
|
3974
|
-
declare function
|
|
3975
|
-
declare function
|
|
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,
|
|
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
|
|
3968
|
-
|
|
3969
|
-
|
|
3970
|
-
|
|
3971
|
-
|
|
3972
|
-
declare
|
|
3973
|
-
declare
|
|
3974
|
-
declare function
|
|
3975
|
-
declare function
|
|
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,
|
|
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/
|
|
2462
|
-
var
|
|
2463
|
-
var DEFAULT_MQTT_CONFIG = {
|
|
2461
|
+
// src/utils/trackingIngest.ts
|
|
2462
|
+
var DEFAULT_TRACKING_INGEST_CONFIG = {
|
|
2464
2463
|
enabled: true,
|
|
2465
|
-
|
|
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
|
|
2474
|
-
function
|
|
2475
|
-
Object.assign(
|
|
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
|
|
2605
|
-
|
|
2606
|
-
stopped = false;
|
|
2607
|
-
reconnectAttempts = 0;
|
|
2608
|
-
openConnection();
|
|
2470
|
+
function configureTrackingIngest(overrides) {
|
|
2471
|
+
applyTrackingIngestConfig(overrides);
|
|
2609
2472
|
}
|
|
2610
|
-
function
|
|
2611
|
-
|
|
2612
|
-
initMQTTClient();
|
|
2613
|
-
}
|
|
2473
|
+
function isTrackingIngestEnabled() {
|
|
2474
|
+
return trackingIngestConfig.enabled === true;
|
|
2614
2475
|
}
|
|
2615
|
-
function
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
if (
|
|
2621
|
-
return
|
|
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
|
|
2634
|
-
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
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(
|
|
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
|
-
|
|
3371
|
+
4,
|
|
3471
3372
|
,
|
|
3472
|
-
|
|
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
|
-
|
|
3490
|
-
|
|
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
|
-
|
|
3403
|
+
5
|
|
3498
3404
|
];
|
|
3499
|
-
case
|
|
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
|
-
|
|
3516
|
+
5,
|
|
3611
3517
|
,
|
|
3612
|
-
|
|
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
|
-
|
|
3635
|
-
|
|
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
|
-
|
|
3562
|
+
6
|
|
3643
3563
|
];
|
|
3644
|
-
case
|
|
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
|
-
|
|
3587
|
+
4,
|
|
3668
3588
|
,
|
|
3669
|
-
|
|
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
|
-
|
|
3680
|
-
|
|
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
|
-
|
|
3616
|
+
5
|
|
3688
3617
|
];
|
|
3689
|
-
case
|
|
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 {
|
|
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
|