stormcloud-video-player 0.8.3 → 0.8.5
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/dist/stormcloud-vp.min.js +3 -1
- package/lib/index.cjs +553 -217
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +46 -2
- package/lib/index.d.ts +46 -2
- package/lib/index.js +494 -218
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +462 -216
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +11 -2
- package/lib/players/HlsPlayer.cjs +462 -216
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +462 -216
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/{types-DWVgdqF-.d.cts → types-CUKMIqHL.d.cts} +5 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +467 -217
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/mqttClient.cjs +245 -0
- package/lib/utils/mqttClient.cjs.map +1 -0
- package/lib/utils/mqttClient.d.cts +13 -0
- package/lib/utils/mqttConfig.cjs +141 -0
- package/lib/utils/mqttConfig.cjs.map +1 -0
- package/lib/utils/mqttConfig.d.cts +20 -0
- package/lib/utils/tracking.cjs +182 -170
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/vastMacros.cjs +231 -0
- package/lib/utils/vastMacros.cjs.map +1 -0
- package/lib/utils/vastMacros.d.cts +24 -0
- package/package.json +3 -1
- package/src/certs/emqxsl-ca.crt +22 -0
package/lib/index.js
CHANGED
|
@@ -1355,6 +1355,123 @@ function createPalNonceManager() {
|
|
|
1355
1355
|
}
|
|
1356
1356
|
};
|
|
1357
1357
|
}
|
|
1358
|
+
// src/utils/mqttConfig.ts
|
|
1359
|
+
var MQTT_CA_CERT_FILE = "src/certs/emqxsl-ca.crt";
|
|
1360
|
+
var DEFAULT_MQTT_CONFIG = {
|
|
1361
|
+
enabled: true,
|
|
1362
|
+
brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
|
|
1363
|
+
brokerPort: 8883,
|
|
1364
|
+
wsPort: 8084,
|
|
1365
|
+
username: "for-sonifi",
|
|
1366
|
+
password: "sonifi-mqtt",
|
|
1367
|
+
topicPrefix: "adstorm/players",
|
|
1368
|
+
qos: 1
|
|
1369
|
+
};
|
|
1370
|
+
var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
|
|
1371
|
+
function applyMQTTConfig(overrides) {
|
|
1372
|
+
Object.assign(mqttConfig, overrides);
|
|
1373
|
+
}
|
|
1374
|
+
function isMQTTEnabled() {
|
|
1375
|
+
return mqttConfig.enabled;
|
|
1376
|
+
}
|
|
1377
|
+
function buildMQTTBrokerUrl() {
|
|
1378
|
+
if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
|
|
1379
|
+
return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
|
|
1380
|
+
}
|
|
1381
|
+
function buildPlayerTopic(licenseKey, channel) {
|
|
1382
|
+
return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
|
|
1383
|
+
}
|
|
1384
|
+
// src/utils/mqttClient.ts
|
|
1385
|
+
import mqtt from "mqtt";
|
|
1386
|
+
var LOG = "[StormcloudVideoPlayer][MQTT]";
|
|
1387
|
+
var client = null;
|
|
1388
|
+
var status = "disconnected";
|
|
1389
|
+
function getMQTTStatus() {
|
|
1390
|
+
return status;
|
|
1391
|
+
}
|
|
1392
|
+
function isMQTTConnected() {
|
|
1393
|
+
return status === "connected" && client !== null && client.connected;
|
|
1394
|
+
}
|
|
1395
|
+
function isMQTTConfigured() {
|
|
1396
|
+
return isMQTTEnabled();
|
|
1397
|
+
}
|
|
1398
|
+
function configureMQTT(overrides) {
|
|
1399
|
+
applyMQTTConfig(overrides);
|
|
1400
|
+
disconnectMQTT();
|
|
1401
|
+
}
|
|
1402
|
+
function initMQTTClient() {
|
|
1403
|
+
if (client || !isMQTTEnabled()) return;
|
|
1404
|
+
var url = buildMQTTBrokerUrl();
|
|
1405
|
+
status = "connecting";
|
|
1406
|
+
var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
|
|
1407
|
+
try {
|
|
1408
|
+
client = mqtt.connect(url, {
|
|
1409
|
+
clientId: clientId,
|
|
1410
|
+
username: mqttConfig.username,
|
|
1411
|
+
password: mqttConfig.password,
|
|
1412
|
+
keepalive: 60,
|
|
1413
|
+
clean: true,
|
|
1414
|
+
reconnectPeriod: 5e3,
|
|
1415
|
+
connectTimeout: 1e4,
|
|
1416
|
+
queueQoSZero: false
|
|
1417
|
+
});
|
|
1418
|
+
} catch (err) {
|
|
1419
|
+
status = "error";
|
|
1420
|
+
console.warn("".concat(LOG, " connect() threw:"), err);
|
|
1421
|
+
return;
|
|
1422
|
+
}
|
|
1423
|
+
client.on("connect", function() {
|
|
1424
|
+
status = "connected";
|
|
1425
|
+
console.info("".concat(LOG, " connected to ").concat(url));
|
|
1426
|
+
});
|
|
1427
|
+
client.on("reconnect", function() {
|
|
1428
|
+
status = "connecting";
|
|
1429
|
+
console.info("".concat(LOG, " reconnecting…"));
|
|
1430
|
+
});
|
|
1431
|
+
client.on("offline", function() {
|
|
1432
|
+
status = "disconnected";
|
|
1433
|
+
console.warn("".concat(LOG, " offline"));
|
|
1434
|
+
});
|
|
1435
|
+
client.on("error", function(err) {
|
|
1436
|
+
status = "error";
|
|
1437
|
+
console.warn("".concat(LOG, " error:"), err.message);
|
|
1438
|
+
});
|
|
1439
|
+
client.on("close", function() {
|
|
1440
|
+
if (status === "connected") {
|
|
1441
|
+
status = "disconnected";
|
|
1442
|
+
}
|
|
1443
|
+
});
|
|
1444
|
+
}
|
|
1445
|
+
function ensureMQTTClient() {
|
|
1446
|
+
if (isMQTTEnabled() && !client) {
|
|
1447
|
+
initMQTTClient();
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
function publishMQTT(topic, payload) {
|
|
1451
|
+
if (!isMQTTEnabled()) {
|
|
1452
|
+
return false;
|
|
1453
|
+
}
|
|
1454
|
+
ensureMQTTClient();
|
|
1455
|
+
if (!client) {
|
|
1456
|
+
return false;
|
|
1457
|
+
}
|
|
1458
|
+
try {
|
|
1459
|
+
client.publish(topic, JSON.stringify(payload), {
|
|
1460
|
+
qos: mqttConfig.qos
|
|
1461
|
+
});
|
|
1462
|
+
return true;
|
|
1463
|
+
} catch (err) {
|
|
1464
|
+
console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
|
|
1465
|
+
return false;
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
function disconnectMQTT() {
|
|
1469
|
+
if (client) {
|
|
1470
|
+
client.end(true);
|
|
1471
|
+
client = null;
|
|
1472
|
+
status = "disconnected";
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1358
1475
|
// src/utils/tracking.ts
|
|
1359
1476
|
var cachedBrowserId = null;
|
|
1360
1477
|
function getClientInfo() {
|
|
@@ -1501,7 +1618,7 @@ function getClientInfo() {
|
|
|
1501
1618
|
}
|
|
1502
1619
|
function getBrowserID(clientInfo) {
|
|
1503
1620
|
return _async_to_generator(function() {
|
|
1504
|
-
var fingerprintString, encodedData, utf8, buffer, i, hashBuffer,
|
|
1621
|
+
var _crypto_subtle, fingerprintString, encodedData, utf8, buffer, i, hashBuffer, hashHex, unused, hash, i1, char, fallbackHash, timestamp, random;
|
|
1505
1622
|
return _ts_generator(this, function(_state) {
|
|
1506
1623
|
switch(_state.label){
|
|
1507
1624
|
case 0:
|
|
@@ -1512,7 +1629,7 @@ function getBrowserID(clientInfo) {
|
|
|
1512
1629
|
];
|
|
1513
1630
|
}
|
|
1514
1631
|
fingerprintString = JSON.stringify(clientInfo);
|
|
1515
|
-
if (!(typeof crypto !== "undefined" && crypto.subtle
|
|
1632
|
+
if (!(typeof crypto !== "undefined" && ((_crypto_subtle = crypto.subtle) === null || _crypto_subtle === void 0 ? void 0 : _crypto_subtle.digest))) return [
|
|
1516
1633
|
3,
|
|
1517
1634
|
5
|
|
1518
1635
|
];
|
|
@@ -1550,8 +1667,7 @@ function getBrowserID(clientInfo) {
|
|
|
1550
1667
|
];
|
|
1551
1668
|
case 3:
|
|
1552
1669
|
hashBuffer = _state.sent();
|
|
1553
|
-
|
|
1554
|
-
hashHex = hashArray.map(function(b) {
|
|
1670
|
+
hashHex = Array.from(new Uint8Array(hashBuffer)).map(function(b) {
|
|
1555
1671
|
return b.toString(16).padStart(2, "0");
|
|
1556
1672
|
}).join("");
|
|
1557
1673
|
cachedBrowserId = hashHex;
|
|
@@ -1560,8 +1676,8 @@ function getBrowserID(clientInfo) {
|
|
|
1560
1676
|
hashHex
|
|
1561
1677
|
];
|
|
1562
1678
|
case 4:
|
|
1563
|
-
|
|
1564
|
-
console.warn("[StormcloudVideoPlayer] crypto.subtle
|
|
1679
|
+
unused = _state.sent();
|
|
1680
|
+
console.warn("[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash");
|
|
1565
1681
|
return [
|
|
1566
1682
|
3,
|
|
1567
1683
|
5
|
|
@@ -1585,177 +1701,91 @@ function getBrowserID(clientInfo) {
|
|
|
1585
1701
|
});
|
|
1586
1702
|
})();
|
|
1587
1703
|
}
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
var HEARTBEAT_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/heartbeat");
|
|
1591
|
-
var IMPRESSIONS_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/impressions/ingest");
|
|
1592
|
-
function buildHeaders(licenseKey) {
|
|
1593
|
-
var headers = {
|
|
1594
|
-
"Content-Type": "application/json"
|
|
1595
|
-
};
|
|
1596
|
-
if (licenseKey) {
|
|
1597
|
-
headers["Authorization"] = "Bearer ".concat(licenseKey);
|
|
1598
|
-
}
|
|
1599
|
-
return headers;
|
|
1600
|
-
}
|
|
1601
|
-
function sendTrackRequest(licenseKey, body) {
|
|
1602
|
-
return _async_to_generator(function() {
|
|
1603
|
-
var response;
|
|
1604
|
-
return _ts_generator(this, function(_state) {
|
|
1605
|
-
switch(_state.label){
|
|
1606
|
-
case 0:
|
|
1607
|
-
return [
|
|
1608
|
-
4,
|
|
1609
|
-
fetch(TRACK_URL, {
|
|
1610
|
-
method: "POST",
|
|
1611
|
-
headers: buildHeaders(licenseKey),
|
|
1612
|
-
body: JSON.stringify(body)
|
|
1613
|
-
})
|
|
1614
|
-
];
|
|
1615
|
-
case 1:
|
|
1616
|
-
response = _state.sent();
|
|
1617
|
-
if (!response.ok) {
|
|
1618
|
-
throw new Error("HTTP error! status: ".concat(response.status));
|
|
1619
|
-
}
|
|
1620
|
-
return [
|
|
1621
|
-
4,
|
|
1622
|
-
response.json()
|
|
1623
|
-
];
|
|
1624
|
-
case 2:
|
|
1625
|
-
_state.sent();
|
|
1626
|
-
return [
|
|
1627
|
-
2
|
|
1628
|
-
];
|
|
1629
|
-
}
|
|
1630
|
-
});
|
|
1631
|
-
})();
|
|
1704
|
+
function canPublish(licenseKey) {
|
|
1705
|
+
return Boolean(isMQTTEnabled() && licenseKey);
|
|
1632
1706
|
}
|
|
1633
|
-
function
|
|
1707
|
+
function buildPlayerMetricEvent() {
|
|
1634
1708
|
return _async_to_generator(function() {
|
|
1635
|
-
var
|
|
1636
|
-
return _ts_generator(this, function(_state) {
|
|
1637
|
-
switch(_state.label){
|
|
1638
|
-
case 0:
|
|
1639
|
-
return [
|
|
1640
|
-
4,
|
|
1641
|
-
fetch(url, {
|
|
1642
|
-
method: "POST",
|
|
1643
|
-
headers: buildHeaders(licenseKey),
|
|
1644
|
-
body: JSON.stringify(body)
|
|
1645
|
-
})
|
|
1646
|
-
];
|
|
1647
|
-
case 1:
|
|
1648
|
-
response = _state.sent();
|
|
1649
|
-
if (!response.ok) {
|
|
1650
|
-
throw new Error("HTTP error! status: ".concat(response.status));
|
|
1651
|
-
}
|
|
1652
|
-
return [
|
|
1653
|
-
4,
|
|
1654
|
-
response.json()
|
|
1655
|
-
];
|
|
1656
|
-
case 2:
|
|
1657
|
-
_state.sent();
|
|
1658
|
-
return [
|
|
1659
|
-
2
|
|
1660
|
-
];
|
|
1661
|
-
}
|
|
1662
|
-
});
|
|
1663
|
-
})();
|
|
1664
|
-
}
|
|
1665
|
-
function buildPlayerMetricEvent(_0) {
|
|
1666
|
-
return _async_to_generator(function(licenseKey) {
|
|
1667
|
-
var context, flags, _flags_captureAt, clientInfo, browserId, captureAt;
|
|
1709
|
+
var context, flags, _flags_captureAt, _flags_adLoaded, _flags_adDetect, clientInfo, playerId, captureAt;
|
|
1668
1710
|
var _arguments = arguments;
|
|
1669
1711
|
return _ts_generator(this, function(_state) {
|
|
1670
1712
|
switch(_state.label){
|
|
1671
1713
|
case 0:
|
|
1672
|
-
context = _arguments.length >
|
|
1714
|
+
context = _arguments.length > 0 && _arguments[0] !== void 0 ? _arguments[0] : {}, flags = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
|
|
1673
1715
|
clientInfo = getClientInfo();
|
|
1674
1716
|
return [
|
|
1675
1717
|
4,
|
|
1676
1718
|
getBrowserID(clientInfo)
|
|
1677
1719
|
];
|
|
1678
1720
|
case 1:
|
|
1679
|
-
|
|
1721
|
+
playerId = _state.sent();
|
|
1680
1722
|
captureAt = (_flags_captureAt = flags.captureAt) !== null && _flags_captureAt !== void 0 ? _flags_captureAt : /* @__PURE__ */ new Date().toISOString();
|
|
1681
1723
|
return [
|
|
1682
1724
|
2,
|
|
1683
|
-
{
|
|
1684
|
-
player_id:
|
|
1685
|
-
browserId: browserId,
|
|
1725
|
+
_object_spread({
|
|
1726
|
+
player_id: playerId,
|
|
1686
1727
|
device_type: clientInfo.deviceType,
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
timestamp: captureAt
|
|
1695
|
-
}
|
|
1728
|
+
os: clientInfo.os.toLowerCase(),
|
|
1729
|
+
ad_loaded: (_flags_adLoaded = flags.adLoaded) !== null && _flags_adLoaded !== void 0 ? _flags_adLoaded : false,
|
|
1730
|
+
ad_detect: (_flags_adDetect = flags.adDetect) !== null && _flags_adDetect !== void 0 ? _flags_adDetect : false,
|
|
1731
|
+
capture_at: captureAt
|
|
1732
|
+
}, context.inputStreamType ? {
|
|
1733
|
+
input_stream_type: context.inputStreamType
|
|
1734
|
+
} : {})
|
|
1696
1735
|
];
|
|
1697
1736
|
}
|
|
1698
1737
|
});
|
|
1699
1738
|
}).apply(this, arguments);
|
|
1700
1739
|
}
|
|
1740
|
+
function publishTracking(licenseKey, channel, body) {
|
|
1741
|
+
ensureMQTTClient();
|
|
1742
|
+
publishMQTT(buildPlayerTopic(licenseKey, channel), body);
|
|
1743
|
+
}
|
|
1701
1744
|
function sendInitialTracking(_0) {
|
|
1702
1745
|
return _async_to_generator(function(licenseKey) {
|
|
1703
|
-
var context,
|
|
1746
|
+
var context, metricEvent, error;
|
|
1704
1747
|
var _arguments = arguments;
|
|
1705
1748
|
return _ts_generator(this, function(_state) {
|
|
1706
1749
|
switch(_state.label){
|
|
1707
1750
|
case 0:
|
|
1708
1751
|
context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
|
|
1752
|
+
if (!canPublish(licenseKey)) return [
|
|
1753
|
+
2
|
|
1754
|
+
];
|
|
1709
1755
|
_state.label = 1;
|
|
1710
1756
|
case 1:
|
|
1711
1757
|
_state.trys.push([
|
|
1712
1758
|
1,
|
|
1713
|
-
|
|
1759
|
+
3,
|
|
1714
1760
|
,
|
|
1715
|
-
|
|
1761
|
+
4
|
|
1716
1762
|
]);
|
|
1717
|
-
clientInfo = getClientInfo();
|
|
1718
1763
|
return [
|
|
1719
1764
|
4,
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
browserId = _state.sent();
|
|
1724
|
-
trackingData = _object_spread({
|
|
1725
|
-
browserId: browserId
|
|
1726
|
-
}, clientInfo);
|
|
1727
|
-
return [
|
|
1728
|
-
4,
|
|
1729
|
-
sendTrackRequest(licenseKey, {
|
|
1730
|
-
events: [
|
|
1731
|
-
{
|
|
1732
|
-
player_id: browserId,
|
|
1733
|
-
device_type: clientInfo.deviceType,
|
|
1734
|
-
input_stream_type: context.inputStreamType,
|
|
1735
|
-
os: clientInfo.os,
|
|
1736
|
-
ad_loaded: false,
|
|
1737
|
-
ad_detect: false,
|
|
1738
|
-
license_key: licenseKey,
|
|
1739
|
-
capture_at: /* @__PURE__ */ new Date().toISOString()
|
|
1740
|
-
}
|
|
1741
|
-
],
|
|
1742
|
-
trackingData: trackingData
|
|
1765
|
+
buildPlayerMetricEvent(context, {
|
|
1766
|
+
adLoaded: false,
|
|
1767
|
+
adDetect: false
|
|
1743
1768
|
})
|
|
1744
1769
|
];
|
|
1745
|
-
case
|
|
1746
|
-
_state.sent();
|
|
1770
|
+
case 2:
|
|
1771
|
+
metricEvent = _state.sent();
|
|
1772
|
+
publishTracking(licenseKey, "metrics", {
|
|
1773
|
+
events: [
|
|
1774
|
+
metricEvent
|
|
1775
|
+
]
|
|
1776
|
+
});
|
|
1747
1777
|
return [
|
|
1748
1778
|
3,
|
|
1749
|
-
|
|
1779
|
+
4
|
|
1750
1780
|
];
|
|
1751
|
-
case
|
|
1781
|
+
case 3:
|
|
1752
1782
|
error = _state.sent();
|
|
1753
1783
|
console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
|
|
1754
1784
|
return [
|
|
1755
1785
|
3,
|
|
1756
|
-
|
|
1786
|
+
4
|
|
1757
1787
|
];
|
|
1758
|
-
case
|
|
1788
|
+
case 4:
|
|
1759
1789
|
return [
|
|
1760
1790
|
2
|
|
1761
1791
|
];
|
|
@@ -1859,53 +1889,48 @@ function sendAdImpressionTracking(_0, _1) {
|
|
|
1859
1889
|
switch(_state.label){
|
|
1860
1890
|
case 0:
|
|
1861
1891
|
context = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
|
|
1892
|
+
if (!canPublish(licenseKey)) return [
|
|
1893
|
+
2
|
|
1894
|
+
];
|
|
1862
1895
|
_state.label = 1;
|
|
1863
1896
|
case 1:
|
|
1864
1897
|
_state.trys.push([
|
|
1865
1898
|
1,
|
|
1866
|
-
|
|
1899
|
+
3,
|
|
1867
1900
|
,
|
|
1868
|
-
|
|
1901
|
+
4
|
|
1869
1902
|
]);
|
|
1870
1903
|
return [
|
|
1871
1904
|
4,
|
|
1872
|
-
buildPlayerMetricEvent(
|
|
1905
|
+
buildPlayerMetricEvent(context, {
|
|
1873
1906
|
captureAt: adImpressionInfo.timestamp
|
|
1874
1907
|
})
|
|
1875
1908
|
];
|
|
1876
1909
|
case 2:
|
|
1877
1910
|
metricEvent = _state.sent();
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
capture_at: adImpressionInfo.timestamp
|
|
1890
|
-
}
|
|
1891
|
-
]
|
|
1892
|
-
})
|
|
1893
|
-
])
|
|
1894
|
-
];
|
|
1895
|
-
case 3:
|
|
1896
|
-
_state.sent();
|
|
1911
|
+
publishTracking(licenseKey, "heartbeat", metricEvent);
|
|
1912
|
+
publishTracking(licenseKey, "impressions", {
|
|
1913
|
+
events: [
|
|
1914
|
+
{
|
|
1915
|
+
player_id: metricEvent.player_id,
|
|
1916
|
+
ad_played_count: 1,
|
|
1917
|
+
ad_url: adImpressionInfo.adUrl,
|
|
1918
|
+
capture_at: adImpressionInfo.timestamp
|
|
1919
|
+
}
|
|
1920
|
+
]
|
|
1921
|
+
});
|
|
1897
1922
|
return [
|
|
1898
1923
|
3,
|
|
1899
|
-
|
|
1924
|
+
4
|
|
1900
1925
|
];
|
|
1901
|
-
case
|
|
1926
|
+
case 3:
|
|
1902
1927
|
error = _state.sent();
|
|
1903
1928
|
console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
|
|
1904
1929
|
return [
|
|
1905
1930
|
3,
|
|
1906
|
-
|
|
1931
|
+
4
|
|
1907
1932
|
];
|
|
1908
|
-
case
|
|
1933
|
+
case 4:
|
|
1909
1934
|
return [
|
|
1910
1935
|
2
|
|
1911
1936
|
];
|
|
@@ -1921,38 +1946,36 @@ function sendHeartbeat(_0) {
|
|
|
1921
1946
|
switch(_state.label){
|
|
1922
1947
|
case 0:
|
|
1923
1948
|
context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {}, flags = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
|
|
1949
|
+
if (!canPublish(licenseKey)) return [
|
|
1950
|
+
2
|
|
1951
|
+
];
|
|
1924
1952
|
_state.label = 1;
|
|
1925
1953
|
case 1:
|
|
1926
1954
|
_state.trys.push([
|
|
1927
1955
|
1,
|
|
1928
|
-
|
|
1956
|
+
3,
|
|
1929
1957
|
,
|
|
1930
|
-
|
|
1958
|
+
4
|
|
1931
1959
|
]);
|
|
1932
1960
|
return [
|
|
1933
1961
|
4,
|
|
1934
|
-
buildPlayerMetricEvent(
|
|
1962
|
+
buildPlayerMetricEvent(context, flags)
|
|
1935
1963
|
];
|
|
1936
1964
|
case 2:
|
|
1937
1965
|
heartbeatData = _state.sent();
|
|
1938
|
-
|
|
1939
|
-
4,
|
|
1940
|
-
postJson(HEARTBEAT_URL, licenseKey, heartbeatData)
|
|
1941
|
-
];
|
|
1942
|
-
case 3:
|
|
1943
|
-
_state.sent();
|
|
1966
|
+
publishTracking(licenseKey, "heartbeat", heartbeatData);
|
|
1944
1967
|
return [
|
|
1945
1968
|
3,
|
|
1946
|
-
|
|
1969
|
+
4
|
|
1947
1970
|
];
|
|
1948
|
-
case
|
|
1971
|
+
case 3:
|
|
1949
1972
|
error = _state.sent();
|
|
1950
1973
|
console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
|
|
1951
1974
|
return [
|
|
1952
1975
|
3,
|
|
1953
|
-
|
|
1976
|
+
4
|
|
1954
1977
|
];
|
|
1955
|
-
case
|
|
1978
|
+
case 4:
|
|
1956
1979
|
return [
|
|
1957
1980
|
2
|
|
1958
1981
|
];
|
|
@@ -2213,6 +2236,166 @@ function initializePolyfills() {
|
|
|
2213
2236
|
polyfillTextEncoder();
|
|
2214
2237
|
polyfillPromiseFinally();
|
|
2215
2238
|
}
|
|
2239
|
+
// src/utils/vastMacros.ts
|
|
2240
|
+
function generateCorrelator() {
|
|
2241
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
2242
|
+
try {
|
|
2243
|
+
var _buf_, _buf_1;
|
|
2244
|
+
var buf = new Uint32Array(2);
|
|
2245
|
+
crypto.getRandomValues(buf);
|
|
2246
|
+
var value = ((_buf_ = buf[0]) !== null && _buf_ !== void 0 ? _buf_ : 0) * 2097152 + (((_buf_1 = buf[1]) !== null && _buf_1 !== void 0 ? _buf_1 : 0) & 2097151);
|
|
2247
|
+
if (value > 0) {
|
|
2248
|
+
return String(value);
|
|
2249
|
+
}
|
|
2250
|
+
} catch (unused) {}
|
|
2251
|
+
}
|
|
2252
|
+
return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
|
|
2253
|
+
}
|
|
2254
|
+
var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
|
|
2255
|
+
function applyVastMacros(baseUrl, ctx) {
|
|
2256
|
+
var url;
|
|
2257
|
+
try {
|
|
2258
|
+
url = new URL(baseUrl);
|
|
2259
|
+
} catch (unused) {
|
|
2260
|
+
return replaceCorrelatorFallback(baseUrl, ctx.correlator);
|
|
2261
|
+
}
|
|
2262
|
+
var params = url.searchParams;
|
|
2263
|
+
params.set("correlator", ctx.correlator);
|
|
2264
|
+
params.set("scor", ctx.streamCorrelator);
|
|
2265
|
+
if (ctx.pod != null) {
|
|
2266
|
+
params.set("pod", String(ctx.pod));
|
|
2267
|
+
}
|
|
2268
|
+
if (ctx.adPosition != null) {
|
|
2269
|
+
params.set("ppos", String(ctx.adPosition));
|
|
2270
|
+
}
|
|
2271
|
+
if (ctx.pageUrl) {
|
|
2272
|
+
params.set("url", ctx.pageUrl);
|
|
2273
|
+
params.set("description_url", ctx.pageUrl);
|
|
2274
|
+
}
|
|
2275
|
+
if (ctx.adWillPlayMuted != null) {
|
|
2276
|
+
params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
|
|
2277
|
+
}
|
|
2278
|
+
if (ctx.adWillAutoPlay != null) {
|
|
2279
|
+
params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
|
|
2280
|
+
}
|
|
2281
|
+
if (ctx.deviceId && ctx.deviceIdType) {
|
|
2282
|
+
params.set("rdid", ctx.deviceId);
|
|
2283
|
+
params.set("idtype", ctx.deviceIdType);
|
|
2284
|
+
params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
|
|
2285
|
+
} else {
|
|
2286
|
+
params.delete("rdid");
|
|
2287
|
+
params.delete("idtype");
|
|
2288
|
+
params.delete("is_lat");
|
|
2289
|
+
}
|
|
2290
|
+
var consent = ctx.consent;
|
|
2291
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
|
|
2292
|
+
params.set("gdpr", consent.gdpr);
|
|
2293
|
+
}
|
|
2294
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
|
|
2295
|
+
params.set("gdpr_consent", consent.gdprConsent);
|
|
2296
|
+
}
|
|
2297
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
|
|
2298
|
+
params.set("us_privacy", consent.usPrivacy);
|
|
2299
|
+
}
|
|
2300
|
+
if (ctx.adTest) {
|
|
2301
|
+
params.set("adtest", "on");
|
|
2302
|
+
}
|
|
2303
|
+
var staleKeys = [];
|
|
2304
|
+
params.forEach(function(value, key) {
|
|
2305
|
+
if (UNEXPANDED_MACRO_PATTERN.test(value)) {
|
|
2306
|
+
staleKeys.push(key);
|
|
2307
|
+
}
|
|
2308
|
+
});
|
|
2309
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
2310
|
+
try {
|
|
2311
|
+
for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
2312
|
+
var key = _step.value;
|
|
2313
|
+
params.delete(key);
|
|
2314
|
+
}
|
|
2315
|
+
} catch (err) {
|
|
2316
|
+
_didIteratorError = true;
|
|
2317
|
+
_iteratorError = err;
|
|
2318
|
+
} finally{
|
|
2319
|
+
try {
|
|
2320
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
2321
|
+
_iterator.return();
|
|
2322
|
+
}
|
|
2323
|
+
} finally{
|
|
2324
|
+
if (_didIteratorError) {
|
|
2325
|
+
throw _iteratorError;
|
|
2326
|
+
}
|
|
2327
|
+
}
|
|
2328
|
+
}
|
|
2329
|
+
return url.toString();
|
|
2330
|
+
}
|
|
2331
|
+
function replaceCorrelatorFallback(baseUrl, correlator) {
|
|
2332
|
+
var correlatorRegex = /([?&])correlator=([^&]*)/;
|
|
2333
|
+
if (correlatorRegex.test(baseUrl)) {
|
|
2334
|
+
return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
|
|
2335
|
+
}
|
|
2336
|
+
var sep = baseUrl.includes("?") ? "&" : "?";
|
|
2337
|
+
return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
|
|
2338
|
+
}
|
|
2339
|
+
function fetchConsentSignals() {
|
|
2340
|
+
var timeoutMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1500;
|
|
2341
|
+
var signals = {};
|
|
2342
|
+
if (typeof window === "undefined") {
|
|
2343
|
+
return Promise.resolve(signals);
|
|
2344
|
+
}
|
|
2345
|
+
var tasks = [];
|
|
2346
|
+
var tcfApi = window.__tcfapi;
|
|
2347
|
+
if (typeof tcfApi === "function") {
|
|
2348
|
+
tasks.push(new Promise(function(resolve) {
|
|
2349
|
+
var settled = false;
|
|
2350
|
+
try {
|
|
2351
|
+
tcfApi("addEventListener", 2, function(tcData, success) {
|
|
2352
|
+
if (settled) return;
|
|
2353
|
+
if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
|
|
2354
|
+
settled = true;
|
|
2355
|
+
signals.gdpr = tcData.gdprApplies ? "1" : "0";
|
|
2356
|
+
if (typeof tcData.tcString === "string" && tcData.tcString) {
|
|
2357
|
+
signals.gdprConsent = tcData.tcString;
|
|
2358
|
+
}
|
|
2359
|
+
try {
|
|
2360
|
+
tcfApi("removeEventListener", 2, function() {}, tcData.listenerId);
|
|
2361
|
+
} catch (unused) {}
|
|
2362
|
+
resolve();
|
|
2363
|
+
}
|
|
2364
|
+
});
|
|
2365
|
+
} catch (unused) {
|
|
2366
|
+
resolve();
|
|
2367
|
+
}
|
|
2368
|
+
setTimeout(function() {
|
|
2369
|
+
if (!settled) {
|
|
2370
|
+
settled = true;
|
|
2371
|
+
resolve();
|
|
2372
|
+
}
|
|
2373
|
+
}, timeoutMs);
|
|
2374
|
+
}));
|
|
2375
|
+
}
|
|
2376
|
+
var uspApi = window.__uspapi;
|
|
2377
|
+
if (typeof uspApi === "function") {
|
|
2378
|
+
tasks.push(new Promise(function(resolve) {
|
|
2379
|
+
try {
|
|
2380
|
+
uspApi("getUSPData", 1, function(data, success) {
|
|
2381
|
+
if (success && typeof (data === null || data === void 0 ? void 0 : data.uspString) === "string" && data.uspString) {
|
|
2382
|
+
signals.usPrivacy = data.uspString;
|
|
2383
|
+
}
|
|
2384
|
+
resolve();
|
|
2385
|
+
});
|
|
2386
|
+
} catch (unused) {
|
|
2387
|
+
resolve();
|
|
2388
|
+
}
|
|
2389
|
+
setTimeout(resolve, timeoutMs);
|
|
2390
|
+
}));
|
|
2391
|
+
}
|
|
2392
|
+
if (tasks.length === 0) {
|
|
2393
|
+
return Promise.resolve(signals);
|
|
2394
|
+
}
|
|
2395
|
+
return Promise.all(tasks).then(function() {
|
|
2396
|
+
return signals;
|
|
2397
|
+
});
|
|
2398
|
+
}
|
|
2216
2399
|
// src/utils/browserCompat.ts
|
|
2217
2400
|
function getChromeVersion(ua) {
|
|
2218
2401
|
var match = ua.match(/Chrome\/(\d+)/);
|
|
@@ -2462,6 +2645,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
2462
2645
|
this.preloadPoolLoopRunning = false;
|
|
2463
2646
|
this.adDetectSentForCurrentBreak = false;
|
|
2464
2647
|
this.palPlaybackStarted = false;
|
|
2648
|
+
this.streamCorrelator = generateCorrelator();
|
|
2649
|
+
this.consentSignals = {};
|
|
2650
|
+
this.podCounter = 0;
|
|
2651
|
+
this.podAssignedByPrefetch = false;
|
|
2652
|
+
this.adRequestPositionInBreak = 0;
|
|
2465
2653
|
this.continuousFetchLoopRunning = false;
|
|
2466
2654
|
initializePolyfills();
|
|
2467
2655
|
var browserOverrides = getBrowserConfigOverrides();
|
|
@@ -2534,6 +2722,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
2534
2722
|
adWillPlayMuted: !!this.config.muted,
|
|
2535
2723
|
continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
|
|
2536
2724
|
}).catch(function() {});
|
|
2725
|
+
fetchConsentSignals().then(function(signals) {
|
|
2726
|
+
_this.consentSignals = signals;
|
|
2727
|
+
}).catch(function() {});
|
|
2537
2728
|
this.initializeTracking();
|
|
2538
2729
|
if (!this.shouldUseNativeHls()) return [
|
|
2539
2730
|
3,
|
|
@@ -2601,7 +2792,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
2601
2792
|
var _level_details, _level_details1;
|
|
2602
2793
|
return (level === null || level === void 0 ? void 0 : (_level_details = level.details) === null || _level_details === void 0 ? void 0 : _level_details.live) === true || (level === null || level === void 0 ? void 0 : (_level_details1 = level.details) === null || _level_details1 === void 0 ? void 0 : _level_details1.type) === "LIVE";
|
|
2603
2794
|
})) !== null && _ref !== void 0 ? _ref : false;
|
|
2604
|
-
if (!this.isLiveStream && this.vmapBreaks.length === 0 && this.apiVastTagUrl) {
|
|
2795
|
+
if (!this.isVmapEnabled() && !this.isLiveStream && this.vmapBreaks.length === 0 && this.apiVastTagUrl) {
|
|
2605
2796
|
prerollKey = "synthetic-vod-preroll";
|
|
2606
2797
|
if (!this.consumedVmapBreakIds.has(prerollKey)) {
|
|
2607
2798
|
this.vmapBreaks = [
|
|
@@ -3186,12 +3377,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
3186
3377
|
_this.palNonce.sendPlaybackStart();
|
|
3187
3378
|
}
|
|
3188
3379
|
});
|
|
3189
|
-
this.
|
|
3380
|
+
this.endedHandler = function() {
|
|
3190
3381
|
if (_this.palPlaybackStarted) {
|
|
3191
3382
|
_this.palPlaybackStarted = false;
|
|
3192
3383
|
_this.palNonce.sendPlaybackEnd();
|
|
3193
3384
|
}
|
|
3194
|
-
|
|
3385
|
+
_this.onVideoEnded();
|
|
3386
|
+
};
|
|
3387
|
+
this.video.addEventListener("ended", this.endedHandler);
|
|
3195
3388
|
this.video.addEventListener("mousedown", function(e) {
|
|
3196
3389
|
_this.palNonce.sendAdTouch(e);
|
|
3197
3390
|
});
|
|
@@ -4513,6 +4706,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4513
4706
|
}
|
|
4514
4707
|
}
|
|
4515
4708
|
},
|
|
4709
|
+
{
|
|
4710
|
+
key: "isVmapEnabled",
|
|
4711
|
+
value: function isVmapEnabled() {
|
|
4712
|
+
var _this_config_vmapUrl;
|
|
4713
|
+
return !!(this.config.isVmap && ((_this_config_vmapUrl = this.config.vmapUrl) === null || _this_config_vmapUrl === void 0 ? void 0 : _this_config_vmapUrl.trim()));
|
|
4714
|
+
}
|
|
4715
|
+
},
|
|
4516
4716
|
{
|
|
4517
4717
|
key: "fetchAdConfiguration",
|
|
4518
4718
|
value: function fetchAdConfiguration() {
|
|
@@ -4521,7 +4721,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4521
4721
|
return _ts_generator(this, function(_state) {
|
|
4522
4722
|
switch(_state.label){
|
|
4523
4723
|
case 0:
|
|
4524
|
-
if (!this.
|
|
4724
|
+
if (!this.isVmapEnabled()) return [
|
|
4525
4725
|
3,
|
|
4526
4726
|
2
|
|
4527
4727
|
];
|
|
@@ -4531,7 +4731,12 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4531
4731
|
];
|
|
4532
4732
|
case 1:
|
|
4533
4733
|
_state.sent();
|
|
4534
|
-
|
|
4734
|
+
if (this.config.debugAdTiming) {
|
|
4735
|
+
console.log("[StormcloudVideoPlayer] VMAP mode enabled");
|
|
4736
|
+
}
|
|
4737
|
+
return [
|
|
4738
|
+
2
|
|
4739
|
+
];
|
|
4535
4740
|
case 2:
|
|
4536
4741
|
vastMode = this.config.vastMode || "default";
|
|
4537
4742
|
if (this.config.debugAdTiming) {
|
|
@@ -4699,7 +4904,16 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4699
4904
|
}
|
|
4700
4905
|
return [];
|
|
4701
4906
|
}
|
|
4702
|
-
var
|
|
4907
|
+
var VMAP_NS = "http://www.iab.net/videosuite/vmap";
|
|
4908
|
+
var adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, "AdBreak"));
|
|
4909
|
+
if (adBreakNodes.length === 0) {
|
|
4910
|
+
adBreakNodes = Array.from(doc.querySelectorAll("AdBreak, vmap\\:AdBreak"));
|
|
4911
|
+
}
|
|
4912
|
+
if (adBreakNodes.length === 0) {
|
|
4913
|
+
adBreakNodes = Array.from(doc.getElementsByTagName("*")).filter(function(el) {
|
|
4914
|
+
return el.localName === "AdBreak";
|
|
4915
|
+
});
|
|
4916
|
+
}
|
|
4703
4917
|
var parsed = [];
|
|
4704
4918
|
adBreakNodes.forEach(function(node, index) {
|
|
4705
4919
|
var timeOffsetRaw = (node.getAttribute("timeOffset") || "").trim();
|
|
@@ -4707,7 +4921,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4707
4921
|
if (startTimeMs == null) {
|
|
4708
4922
|
return;
|
|
4709
4923
|
}
|
|
4710
|
-
var adTagNode = node.
|
|
4924
|
+
var adTagNode = node.getElementsByTagNameNS(VMAP_NS, "AdTagURI")[0];
|
|
4925
|
+
if (!adTagNode) {
|
|
4926
|
+
var _node_querySelector;
|
|
4927
|
+
adTagNode = (_node_querySelector = node.querySelector("AdTagURI, vmap\\:AdTagURI")) !== null && _node_querySelector !== void 0 ? _node_querySelector : void 0;
|
|
4928
|
+
}
|
|
4711
4929
|
var adTagUrl = ((adTagNode === null || adTagNode === void 0 ? void 0 : adTagNode.textContent) || "").trim();
|
|
4712
4930
|
if (!adTagUrl) {
|
|
4713
4931
|
return;
|
|
@@ -4803,25 +5021,35 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4803
5021
|
return this.getRemainingAdMs();
|
|
4804
5022
|
}
|
|
4805
5023
|
},
|
|
5024
|
+
{
|
|
5025
|
+
key: "beginNewAdPod",
|
|
5026
|
+
value: function beginNewAdPod() {
|
|
5027
|
+
this.podCounter++;
|
|
5028
|
+
this.adRequestPositionInBreak = 0;
|
|
5029
|
+
}
|
|
5030
|
+
},
|
|
4806
5031
|
{
|
|
4807
5032
|
key: "generateVastUrlsWithCorrelators",
|
|
4808
5033
|
value: function generateVastUrlsWithCorrelators(baseUrl, count) {
|
|
4809
5034
|
var urls = [];
|
|
4810
|
-
var baseTimestamp = Date.now();
|
|
4811
5035
|
for(var i = 0; i < count; i++){
|
|
4812
|
-
|
|
4813
|
-
var
|
|
4814
|
-
var
|
|
4815
|
-
|
|
4816
|
-
|
|
4817
|
-
|
|
4818
|
-
|
|
4819
|
-
|
|
4820
|
-
|
|
4821
|
-
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
5036
|
+
this.adRequestPositionInBreak++;
|
|
5037
|
+
var adWillPlayMuted = this.inAdBreak ? this.adPlayer.getOriginalMutedState() : this.video.muted;
|
|
5038
|
+
var urlWithMacros = applyVastMacros(baseUrl, {
|
|
5039
|
+
correlator: generateCorrelator(),
|
|
5040
|
+
streamCorrelator: this.streamCorrelator,
|
|
5041
|
+
pod: this.podCounter > 0 ? this.podCounter : void 0,
|
|
5042
|
+
adPosition: this.adRequestPositionInBreak,
|
|
5043
|
+
pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
|
|
5044
|
+
adWillPlayMuted: adWillPlayMuted,
|
|
5045
|
+
adWillAutoPlay: !!this.config.autoplay,
|
|
5046
|
+
deviceId: this.config.deviceId,
|
|
5047
|
+
deviceIdType: this.config.deviceIdType,
|
|
5048
|
+
limitAdTracking: this.config.limitAdTracking,
|
|
5049
|
+
adTest: this.config.adTest,
|
|
5050
|
+
consent: this.consentSignals
|
|
5051
|
+
});
|
|
5052
|
+
urls.push(this.palNonce.injectNonce(urlWithMacros));
|
|
4825
5053
|
}
|
|
4826
5054
|
return urls;
|
|
4827
5055
|
}
|
|
@@ -4891,6 +5119,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4891
5119
|
}
|
|
4892
5120
|
return;
|
|
4893
5121
|
}
|
|
5122
|
+
this.beginNewAdPod();
|
|
5123
|
+
this.podAssignedByPrefetch = true;
|
|
4894
5124
|
var urlsToPregenerate = 5;
|
|
4895
5125
|
var generatedUrls = this.generateVastUrlsWithCorrelators(baseVastUrl, urlsToPregenerate);
|
|
4896
5126
|
this.pendingAdBreak = _object_spread_props(_object_spread({
|
|
@@ -4928,6 +5158,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4928
5158
|
}
|
|
4929
5159
|
this.pendingAdBreak = null;
|
|
4930
5160
|
this.pendingScte35CueKey = void 0;
|
|
5161
|
+
this.podAssignedByPrefetch = false;
|
|
4931
5162
|
}
|
|
4932
5163
|
},
|
|
4933
5164
|
{
|
|
@@ -5364,6 +5595,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
5364
5595
|
this.continuousFetchingActive = true;
|
|
5365
5596
|
this.isShowingPlaceholder = false;
|
|
5366
5597
|
this.totalAdRequestsInBreak = 0;
|
|
5598
|
+
if (this.podAssignedByPrefetch) {
|
|
5599
|
+
this.podAssignedByPrefetch = false;
|
|
5600
|
+
} else {
|
|
5601
|
+
this.beginNewAdPod();
|
|
5602
|
+
}
|
|
5367
5603
|
currentMuted = this.video.muted;
|
|
5368
5604
|
currentVolume = this.video.volume;
|
|
5369
5605
|
this.adPlayer.updateOriginalMutedState(currentMuted, currentVolume);
|
|
@@ -6264,23 +6500,49 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6264
6500
|
key: "onTimeUpdate",
|
|
6265
6501
|
value: function onTimeUpdate(currentTimeSec) {
|
|
6266
6502
|
var _this = this;
|
|
6503
|
+
if (!this.isVmapEnabled() || this.vmapBreaks.length === 0) {
|
|
6504
|
+
return;
|
|
6505
|
+
}
|
|
6267
6506
|
if (this.adPlayer.isAdPlaying() || this.inAdBreak) return;
|
|
6268
6507
|
var nowMs = currentTimeSec * 1e3;
|
|
6269
6508
|
var breakToPlay = this.findBreakForTime(nowMs);
|
|
6270
6509
|
if (breakToPlay) {
|
|
6271
|
-
void this.
|
|
6510
|
+
void this.handleVmapAdBreak(breakToPlay, nowMs).catch(function(error) {
|
|
6272
6511
|
if (_this.config.debugAdTiming) {
|
|
6273
|
-
console.warn("[StormcloudVideoPlayer]
|
|
6512
|
+
console.warn("[StormcloudVideoPlayer] VMAP ad break failed gracefully:", error);
|
|
6274
6513
|
}
|
|
6275
6514
|
});
|
|
6276
6515
|
}
|
|
6277
6516
|
}
|
|
6278
6517
|
},
|
|
6279
6518
|
{
|
|
6280
|
-
key: "
|
|
6281
|
-
value: function
|
|
6519
|
+
key: "onVideoEnded",
|
|
6520
|
+
value: function onVideoEnded() {
|
|
6521
|
+
var _this = this;
|
|
6522
|
+
if (!this.isVmapEnabled() || this.vmapBreaks.length === 0) {
|
|
6523
|
+
return;
|
|
6524
|
+
}
|
|
6525
|
+
if (this.adPlayer.isAdPlaying() || this.inAdBreak) {
|
|
6526
|
+
return;
|
|
6527
|
+
}
|
|
6528
|
+
var durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;
|
|
6529
|
+
var postroll = this.vmapBreaks.find(function(b) {
|
|
6530
|
+
return b.startTimeMs === -1 && !_this.consumedVmapBreakIds.has(_this.getAdBreakKey(b));
|
|
6531
|
+
});
|
|
6532
|
+
if (postroll) {
|
|
6533
|
+
void this.handleVmapAdBreak(postroll, durationMs).catch(function(error) {
|
|
6534
|
+
if (_this.config.debugAdTiming) {
|
|
6535
|
+
console.warn("[StormcloudVideoPlayer] VMAP post-roll failed gracefully:", error);
|
|
6536
|
+
}
|
|
6537
|
+
});
|
|
6538
|
+
}
|
|
6539
|
+
}
|
|
6540
|
+
},
|
|
6541
|
+
{
|
|
6542
|
+
key: "handleVmapAdBreak",
|
|
6543
|
+
value: function handleVmapAdBreak(adBreak, nowMs) {
|
|
6282
6544
|
return _async_to_generator(function() {
|
|
6283
|
-
var _adBreak_durationMs,
|
|
6545
|
+
var _adBreak_durationMs, key, breakStartMs, durationMs, endMs, inWindow, tags, first, rest, error;
|
|
6284
6546
|
return _ts_generator(this, function(_state) {
|
|
6285
6547
|
switch(_state.label){
|
|
6286
6548
|
case 0:
|
|
@@ -6298,25 +6560,28 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6298
6560
|
}
|
|
6299
6561
|
durationMs = (_adBreak_durationMs = adBreak.durationMs) !== null && _adBreak_durationMs !== void 0 ? _adBreak_durationMs : 0;
|
|
6300
6562
|
endMs = breakStartMs + durationMs;
|
|
6301
|
-
|
|
6302
|
-
inWindow = durationMs > 0 ? nowMs > breakStartMs && nowMs < endMs : nowMs + tol >= breakStartMs;
|
|
6563
|
+
inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;
|
|
6303
6564
|
if (!inWindow) return [
|
|
6304
6565
|
3,
|
|
6305
6566
|
4
|
|
6306
6567
|
];
|
|
6307
6568
|
this.consumedVmapBreakIds.add(key);
|
|
6308
|
-
|
|
6309
|
-
|
|
6310
|
-
|
|
6311
|
-
|
|
6312
|
-
|
|
6313
|
-
|
|
6314
|
-
4
|
|
6315
|
-
];
|
|
6569
|
+
tags = this.selectVastTagsForBreak(adBreak);
|
|
6570
|
+
if (!tags || tags.length === 0) {
|
|
6571
|
+
return [
|
|
6572
|
+
2
|
|
6573
|
+
];
|
|
6574
|
+
}
|
|
6316
6575
|
first = tags[0];
|
|
6317
6576
|
rest = tags.slice(1);
|
|
6318
6577
|
this.adPodQueue = rest;
|
|
6319
6578
|
this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);
|
|
6579
|
+
this.showAds = true;
|
|
6580
|
+
this.inAdBreak = true;
|
|
6581
|
+
this.currentAdBreakStartWallClockMs = Date.now();
|
|
6582
|
+
if (!this.video.paused) {
|
|
6583
|
+
this.video.pause();
|
|
6584
|
+
}
|
|
6320
6585
|
_state.label = 1;
|
|
6321
6586
|
case 1:
|
|
6322
6587
|
_state.trys.push([
|
|
@@ -6331,10 +6596,6 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6331
6596
|
];
|
|
6332
6597
|
case 2:
|
|
6333
6598
|
_state.sent();
|
|
6334
|
-
this.inAdBreak = true;
|
|
6335
|
-
this.expectedAdBreakDurationMs = remainingMs;
|
|
6336
|
-
this.currentAdBreakStartWallClockMs = Date.now();
|
|
6337
|
-
this.scheduleAdStopCountdown(remainingMs);
|
|
6338
6599
|
return [
|
|
6339
6600
|
3,
|
|
6340
6601
|
4
|
|
@@ -6342,8 +6603,10 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6342
6603
|
case 3:
|
|
6343
6604
|
error = _state.sent();
|
|
6344
6605
|
this.adPodQueue = [];
|
|
6606
|
+
this.inAdBreak = false;
|
|
6607
|
+
this.showAds = false;
|
|
6345
6608
|
if (this.config.debugAdTiming) {
|
|
6346
|
-
console.warn("[StormcloudVideoPlayer]
|
|
6609
|
+
console.warn("[StormcloudVideoPlayer] VMAP ad request failed:", error);
|
|
6347
6610
|
}
|
|
6348
6611
|
return [
|
|
6349
6612
|
3,
|
|
@@ -7055,9 +7318,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
7055
7318
|
{
|
|
7056
7319
|
key: "findBreakForTime",
|
|
7057
7320
|
value: function findBreakForTime(nowMs) {
|
|
7058
|
-
var _this_config_driftToleranceMs;
|
|
7059
7321
|
var schedule = this.vmapBreaks;
|
|
7060
|
-
var tol = (_this_config_driftToleranceMs = this.config.driftToleranceMs) !== null && _this_config_driftToleranceMs !== void 0 ? _this_config_driftToleranceMs : 1e3;
|
|
7061
7322
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
7062
7323
|
try {
|
|
7063
7324
|
for(var _iterator = schedule[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
@@ -7069,9 +7330,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
7069
7330
|
if (breakStartMs == null) {
|
|
7070
7331
|
continue;
|
|
7071
7332
|
}
|
|
7072
|
-
|
|
7073
|
-
|
|
7074
|
-
|
|
7333
|
+
if (b.durationMs) {
|
|
7334
|
+
var end = breakStartMs + b.durationMs;
|
|
7335
|
+
if (nowMs >= breakStartMs && nowMs < end) {
|
|
7336
|
+
return b;
|
|
7337
|
+
}
|
|
7338
|
+
continue;
|
|
7339
|
+
}
|
|
7340
|
+
if (nowMs >= breakStartMs) {
|
|
7075
7341
|
return b;
|
|
7076
7342
|
}
|
|
7077
7343
|
}
|
|
@@ -7279,6 +7545,10 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
7279
7545
|
this.video.removeEventListener("timeupdate", this.timeUpdateHandler);
|
|
7280
7546
|
delete this.timeUpdateHandler;
|
|
7281
7547
|
}
|
|
7548
|
+
if (this.endedHandler) {
|
|
7549
|
+
this.video.removeEventListener("ended", this.endedHandler);
|
|
7550
|
+
delete this.endedHandler;
|
|
7551
|
+
}
|
|
7282
7552
|
if (this.emptiedHandler) {
|
|
7283
7553
|
this.video.removeEventListener("emptied", this.emptiedHandler);
|
|
7284
7554
|
delete this.emptiedHandler;
|
|
@@ -7309,6 +7579,7 @@ var CRITICAL_PROPS = [
|
|
|
7309
7579
|
"allowNativeHls",
|
|
7310
7580
|
"isLiveStream",
|
|
7311
7581
|
"licenseKey",
|
|
7582
|
+
"isVmap",
|
|
7312
7583
|
"vmapUrl",
|
|
7313
7584
|
"lowLatencyMode",
|
|
7314
7585
|
"driftToleranceMs",
|
|
@@ -7317,7 +7588,7 @@ var CRITICAL_PROPS = [
|
|
|
7317
7588
|
var CONTROLS_HIDE_DELAY = 3e3;
|
|
7318
7589
|
var DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;
|
|
7319
7590
|
var StormcloudVideoPlayerComponent = React.memo(function(props) {
|
|
7320
|
-
var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, isLiveStream = props.isLiveStream, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, vastMode = props.vastMode, vastTagUrl = props.vastTagUrl, vmapUrl = props.vmapUrl, minSegmentsBeforePlay = props.minSegmentsBeforePlay, restVideoAttrs = _object_without_properties(props, [
|
|
7591
|
+
var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, isLiveStream = props.isLiveStream, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, vastMode = props.vastMode, vastTagUrl = props.vastTagUrl, isVmap = props.isVmap, vmapUrl = props.vmapUrl, minSegmentsBeforePlay = props.minSegmentsBeforePlay, restVideoAttrs = _object_without_properties(props, [
|
|
7321
7592
|
"src",
|
|
7322
7593
|
"autoplay",
|
|
7323
7594
|
"muted",
|
|
@@ -7345,6 +7616,7 @@ var StormcloudVideoPlayerComponent = React.memo(function(props) {
|
|
|
7345
7616
|
"licenseKey",
|
|
7346
7617
|
"vastMode",
|
|
7347
7618
|
"vastTagUrl",
|
|
7619
|
+
"isVmap",
|
|
7348
7620
|
"vmapUrl",
|
|
7349
7621
|
"minSegmentsBeforePlay"
|
|
7350
7622
|
]);
|
|
@@ -7487,6 +7759,7 @@ var StormcloudVideoPlayerComponent = React.memo(function(props) {
|
|
|
7487
7759
|
allowNativeHls,
|
|
7488
7760
|
isLiveStream,
|
|
7489
7761
|
licenseKey,
|
|
7762
|
+
isVmap,
|
|
7490
7763
|
vmapUrl,
|
|
7491
7764
|
lowLatencyMode,
|
|
7492
7765
|
driftToleranceMs,
|
|
@@ -7531,6 +7804,7 @@ var StormcloudVideoPlayerComponent = React.memo(function(props) {
|
|
|
7531
7804
|
if (licenseKey !== void 0) cfg.licenseKey = licenseKey;
|
|
7532
7805
|
if (vastMode !== void 0) cfg.vastMode = vastMode;
|
|
7533
7806
|
if (vastTagUrl !== void 0) cfg.vastTagUrl = vastTagUrl;
|
|
7807
|
+
if (isVmap !== void 0) cfg.isVmap = isVmap;
|
|
7534
7808
|
if (vmapUrl !== void 0) cfg.vmapUrl = vmapUrl;
|
|
7535
7809
|
if (minSegmentsBeforePlay !== void 0) cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;
|
|
7536
7810
|
var player = new StormcloudVideoPlayer(cfg);
|
|
@@ -8693,6 +8967,7 @@ var defaultProps = {
|
|
|
8693
8967
|
showCustomControls: false,
|
|
8694
8968
|
hideLoadingIndicator: false,
|
|
8695
8969
|
licenseKey: "",
|
|
8970
|
+
isVmap: false,
|
|
8696
8971
|
vmapUrl: "",
|
|
8697
8972
|
adFailsafeTimeoutMs: 1e4,
|
|
8698
8973
|
minSegmentsBeforePlay: 2,
|
|
@@ -9640,6 +9915,7 @@ var SUPPORTED_PROPS = [
|
|
|
9640
9915
|
"debugAdTiming",
|
|
9641
9916
|
"showCustomControls",
|
|
9642
9917
|
"licenseKey",
|
|
9918
|
+
"isVmap",
|
|
9643
9919
|
"vmapUrl",
|
|
9644
9920
|
"adFailsafeTimeoutMs",
|
|
9645
9921
|
"minSegmentsBeforePlay",
|
|
@@ -9828,5 +10104,5 @@ var createStormcloudPlayer = function createStormcloudPlayer(playerList, fallbac
|
|
|
9828
10104
|
};
|
|
9829
10105
|
var StormcloudPlayer = createStormcloudPlayer(players_default, players_default[players_default.length - 1]);
|
|
9830
10106
|
var StormcloudPlayer_default = StormcloudPlayer;
|
|
9831
|
-
export { IS_BROWSER, IS_GLOBAL, IS_IOS, IS_SAFARI, SUPPORTS_DASH, SUPPORTS_HLS, StormcloudPlayer_default as StormcloudPlayer, StormcloudVideoPlayer, StormcloudVideoPlayerComponent, canPlay, createHlsAdPlayer, createPalNonceManager, createStormcloudPlayer, StormcloudVideoPlayerComponent as default, detectBrowser, getBrowserConfigOverrides, getBrowserID, getClientInfo, initializePolyfills, isMediaStream, lazy, logBrowserInfo, merge, omit, parseQuery, players_default as players, randomString, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode };
|
|
10107
|
+
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, 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, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking, supportsFeature, supportsModernJS, supportsWebKitPresentationMode };
|
|
9832
10108
|
//# sourceMappingURL=index.js.map
|