stormcloud-video-player 0.8.3 → 0.8.4
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 +353 -203
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +36 -2
- package/lib/index.d.ts +36 -2
- package/lib/index.js +294 -204
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +262 -202
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +5 -2
- package/lib/players/HlsPlayer.cjs +262 -202
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +262 -202
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/{types-DWVgdqF-.d.cts → types-BmF_60m2.d.cts} +1 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +267 -203
- 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/package.json +3 -1
- package/src/certs/emqxsl-ca.crt +22 -0
|
@@ -1371,6 +1371,99 @@ function createPalNonceManager() {
|
|
|
1371
1371
|
}
|
|
1372
1372
|
};
|
|
1373
1373
|
}
|
|
1374
|
+
// src/utils/mqttConfig.ts
|
|
1375
|
+
var DEFAULT_MQTT_CONFIG = {
|
|
1376
|
+
enabled: true,
|
|
1377
|
+
brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
|
|
1378
|
+
brokerPort: 8883,
|
|
1379
|
+
wsPort: 8084,
|
|
1380
|
+
username: "for-sonifi",
|
|
1381
|
+
password: "sonifi-mqtt",
|
|
1382
|
+
topicPrefix: "adstorm/players",
|
|
1383
|
+
qos: 1
|
|
1384
|
+
};
|
|
1385
|
+
var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
|
|
1386
|
+
function isMQTTEnabled() {
|
|
1387
|
+
return mqttConfig.enabled;
|
|
1388
|
+
}
|
|
1389
|
+
function buildMQTTBrokerUrl() {
|
|
1390
|
+
if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
|
|
1391
|
+
return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
|
|
1392
|
+
}
|
|
1393
|
+
function buildPlayerTopic(licenseKey, channel) {
|
|
1394
|
+
return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
|
|
1395
|
+
}
|
|
1396
|
+
// src/utils/mqttClient.ts
|
|
1397
|
+
var import_mqtt = __toESM(require("mqtt"), 1);
|
|
1398
|
+
var LOG = "[StormcloudVideoPlayer][MQTT]";
|
|
1399
|
+
var client = null;
|
|
1400
|
+
var status = "disconnected";
|
|
1401
|
+
function initMQTTClient() {
|
|
1402
|
+
if (client || !isMQTTEnabled()) return;
|
|
1403
|
+
var url = buildMQTTBrokerUrl();
|
|
1404
|
+
status = "connecting";
|
|
1405
|
+
var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
|
|
1406
|
+
try {
|
|
1407
|
+
client = import_mqtt.default.connect(url, {
|
|
1408
|
+
clientId: clientId,
|
|
1409
|
+
username: mqttConfig.username,
|
|
1410
|
+
password: mqttConfig.password,
|
|
1411
|
+
keepalive: 60,
|
|
1412
|
+
clean: true,
|
|
1413
|
+
reconnectPeriod: 5e3,
|
|
1414
|
+
connectTimeout: 1e4,
|
|
1415
|
+
queueQoSZero: false
|
|
1416
|
+
});
|
|
1417
|
+
} catch (err) {
|
|
1418
|
+
status = "error";
|
|
1419
|
+
console.warn("".concat(LOG, " connect() threw:"), err);
|
|
1420
|
+
return;
|
|
1421
|
+
}
|
|
1422
|
+
client.on("connect", function() {
|
|
1423
|
+
status = "connected";
|
|
1424
|
+
console.info("".concat(LOG, " connected to ").concat(url));
|
|
1425
|
+
});
|
|
1426
|
+
client.on("reconnect", function() {
|
|
1427
|
+
status = "connecting";
|
|
1428
|
+
console.info("".concat(LOG, " reconnecting…"));
|
|
1429
|
+
});
|
|
1430
|
+
client.on("offline", function() {
|
|
1431
|
+
status = "disconnected";
|
|
1432
|
+
console.warn("".concat(LOG, " offline"));
|
|
1433
|
+
});
|
|
1434
|
+
client.on("error", function(err) {
|
|
1435
|
+
status = "error";
|
|
1436
|
+
console.warn("".concat(LOG, " error:"), err.message);
|
|
1437
|
+
});
|
|
1438
|
+
client.on("close", function() {
|
|
1439
|
+
if (status === "connected") {
|
|
1440
|
+
status = "disconnected";
|
|
1441
|
+
}
|
|
1442
|
+
});
|
|
1443
|
+
}
|
|
1444
|
+
function ensureMQTTClient() {
|
|
1445
|
+
if (isMQTTEnabled() && !client) {
|
|
1446
|
+
initMQTTClient();
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
function publishMQTT(topic, payload) {
|
|
1450
|
+
if (!isMQTTEnabled()) {
|
|
1451
|
+
return false;
|
|
1452
|
+
}
|
|
1453
|
+
ensureMQTTClient();
|
|
1454
|
+
if (!client) {
|
|
1455
|
+
return false;
|
|
1456
|
+
}
|
|
1457
|
+
try {
|
|
1458
|
+
client.publish(topic, JSON.stringify(payload), {
|
|
1459
|
+
qos: mqttConfig.qos
|
|
1460
|
+
});
|
|
1461
|
+
return true;
|
|
1462
|
+
} catch (err) {
|
|
1463
|
+
console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
|
|
1464
|
+
return false;
|
|
1465
|
+
}
|
|
1466
|
+
}
|
|
1374
1467
|
// src/utils/tracking.ts
|
|
1375
1468
|
var cachedBrowserId = null;
|
|
1376
1469
|
function getClientInfo() {
|
|
@@ -1517,7 +1610,7 @@ function getClientInfo() {
|
|
|
1517
1610
|
}
|
|
1518
1611
|
function getBrowserID(clientInfo) {
|
|
1519
1612
|
return _async_to_generator(function() {
|
|
1520
|
-
var fingerprintString, encodedData, utf8, buffer, i, hashBuffer,
|
|
1613
|
+
var _crypto_subtle, fingerprintString, encodedData, utf8, buffer, i, hashBuffer, hashHex, unused, hash, i1, char, fallbackHash, timestamp, random;
|
|
1521
1614
|
return _ts_generator(this, function(_state) {
|
|
1522
1615
|
switch(_state.label){
|
|
1523
1616
|
case 0:
|
|
@@ -1528,7 +1621,7 @@ function getBrowserID(clientInfo) {
|
|
|
1528
1621
|
];
|
|
1529
1622
|
}
|
|
1530
1623
|
fingerprintString = JSON.stringify(clientInfo);
|
|
1531
|
-
if (!(typeof crypto !== "undefined" && crypto.subtle
|
|
1624
|
+
if (!(typeof crypto !== "undefined" && ((_crypto_subtle = crypto.subtle) === null || _crypto_subtle === void 0 ? void 0 : _crypto_subtle.digest))) return [
|
|
1532
1625
|
3,
|
|
1533
1626
|
5
|
|
1534
1627
|
];
|
|
@@ -1566,8 +1659,7 @@ function getBrowserID(clientInfo) {
|
|
|
1566
1659
|
];
|
|
1567
1660
|
case 3:
|
|
1568
1661
|
hashBuffer = _state.sent();
|
|
1569
|
-
|
|
1570
|
-
hashHex = hashArray.map(function(b) {
|
|
1662
|
+
hashHex = Array.from(new Uint8Array(hashBuffer)).map(function(b) {
|
|
1571
1663
|
return b.toString(16).padStart(2, "0");
|
|
1572
1664
|
}).join("");
|
|
1573
1665
|
cachedBrowserId = hashHex;
|
|
@@ -1576,8 +1668,8 @@ function getBrowserID(clientInfo) {
|
|
|
1576
1668
|
hashHex
|
|
1577
1669
|
];
|
|
1578
1670
|
case 4:
|
|
1579
|
-
|
|
1580
|
-
console.warn("[StormcloudVideoPlayer] crypto.subtle
|
|
1671
|
+
unused = _state.sent();
|
|
1672
|
+
console.warn("[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash");
|
|
1581
1673
|
return [
|
|
1582
1674
|
3,
|
|
1583
1675
|
5
|
|
@@ -1601,177 +1693,91 @@ function getBrowserID(clientInfo) {
|
|
|
1601
1693
|
});
|
|
1602
1694
|
})();
|
|
1603
1695
|
}
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
var HEARTBEAT_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/heartbeat");
|
|
1607
|
-
var IMPRESSIONS_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/impressions/ingest");
|
|
1608
|
-
function buildHeaders(licenseKey) {
|
|
1609
|
-
var headers = {
|
|
1610
|
-
"Content-Type": "application/json"
|
|
1611
|
-
};
|
|
1612
|
-
if (licenseKey) {
|
|
1613
|
-
headers["Authorization"] = "Bearer ".concat(licenseKey);
|
|
1614
|
-
}
|
|
1615
|
-
return headers;
|
|
1616
|
-
}
|
|
1617
|
-
function sendTrackRequest(licenseKey, body) {
|
|
1618
|
-
return _async_to_generator(function() {
|
|
1619
|
-
var response;
|
|
1620
|
-
return _ts_generator(this, function(_state) {
|
|
1621
|
-
switch(_state.label){
|
|
1622
|
-
case 0:
|
|
1623
|
-
return [
|
|
1624
|
-
4,
|
|
1625
|
-
fetch(TRACK_URL, {
|
|
1626
|
-
method: "POST",
|
|
1627
|
-
headers: buildHeaders(licenseKey),
|
|
1628
|
-
body: JSON.stringify(body)
|
|
1629
|
-
})
|
|
1630
|
-
];
|
|
1631
|
-
case 1:
|
|
1632
|
-
response = _state.sent();
|
|
1633
|
-
if (!response.ok) {
|
|
1634
|
-
throw new Error("HTTP error! status: ".concat(response.status));
|
|
1635
|
-
}
|
|
1636
|
-
return [
|
|
1637
|
-
4,
|
|
1638
|
-
response.json()
|
|
1639
|
-
];
|
|
1640
|
-
case 2:
|
|
1641
|
-
_state.sent();
|
|
1642
|
-
return [
|
|
1643
|
-
2
|
|
1644
|
-
];
|
|
1645
|
-
}
|
|
1646
|
-
});
|
|
1647
|
-
})();
|
|
1696
|
+
function canPublish(licenseKey) {
|
|
1697
|
+
return Boolean(isMQTTEnabled() && licenseKey);
|
|
1648
1698
|
}
|
|
1649
|
-
function
|
|
1699
|
+
function buildPlayerMetricEvent() {
|
|
1650
1700
|
return _async_to_generator(function() {
|
|
1651
|
-
var
|
|
1652
|
-
return _ts_generator(this, function(_state) {
|
|
1653
|
-
switch(_state.label){
|
|
1654
|
-
case 0:
|
|
1655
|
-
return [
|
|
1656
|
-
4,
|
|
1657
|
-
fetch(url, {
|
|
1658
|
-
method: "POST",
|
|
1659
|
-
headers: buildHeaders(licenseKey),
|
|
1660
|
-
body: JSON.stringify(body)
|
|
1661
|
-
})
|
|
1662
|
-
];
|
|
1663
|
-
case 1:
|
|
1664
|
-
response = _state.sent();
|
|
1665
|
-
if (!response.ok) {
|
|
1666
|
-
throw new Error("HTTP error! status: ".concat(response.status));
|
|
1667
|
-
}
|
|
1668
|
-
return [
|
|
1669
|
-
4,
|
|
1670
|
-
response.json()
|
|
1671
|
-
];
|
|
1672
|
-
case 2:
|
|
1673
|
-
_state.sent();
|
|
1674
|
-
return [
|
|
1675
|
-
2
|
|
1676
|
-
];
|
|
1677
|
-
}
|
|
1678
|
-
});
|
|
1679
|
-
})();
|
|
1680
|
-
}
|
|
1681
|
-
function buildPlayerMetricEvent(_0) {
|
|
1682
|
-
return _async_to_generator(function(licenseKey) {
|
|
1683
|
-
var context, flags, _flags_captureAt, clientInfo, browserId, captureAt;
|
|
1701
|
+
var context, flags, _flags_captureAt, _flags_adLoaded, _flags_adDetect, clientInfo, playerId, captureAt;
|
|
1684
1702
|
var _arguments = arguments;
|
|
1685
1703
|
return _ts_generator(this, function(_state) {
|
|
1686
1704
|
switch(_state.label){
|
|
1687
1705
|
case 0:
|
|
1688
|
-
context = _arguments.length >
|
|
1706
|
+
context = _arguments.length > 0 && _arguments[0] !== void 0 ? _arguments[0] : {}, flags = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
|
|
1689
1707
|
clientInfo = getClientInfo();
|
|
1690
1708
|
return [
|
|
1691
1709
|
4,
|
|
1692
1710
|
getBrowserID(clientInfo)
|
|
1693
1711
|
];
|
|
1694
1712
|
case 1:
|
|
1695
|
-
|
|
1713
|
+
playerId = _state.sent();
|
|
1696
1714
|
captureAt = (_flags_captureAt = flags.captureAt) !== null && _flags_captureAt !== void 0 ? _flags_captureAt : /* @__PURE__ */ new Date().toISOString();
|
|
1697
1715
|
return [
|
|
1698
1716
|
2,
|
|
1699
|
-
{
|
|
1700
|
-
player_id:
|
|
1701
|
-
browserId: browserId,
|
|
1717
|
+
_object_spread({
|
|
1718
|
+
player_id: playerId,
|
|
1702
1719
|
device_type: clientInfo.deviceType,
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
timestamp: captureAt
|
|
1711
|
-
}
|
|
1720
|
+
os: clientInfo.os.toLowerCase(),
|
|
1721
|
+
ad_loaded: (_flags_adLoaded = flags.adLoaded) !== null && _flags_adLoaded !== void 0 ? _flags_adLoaded : false,
|
|
1722
|
+
ad_detect: (_flags_adDetect = flags.adDetect) !== null && _flags_adDetect !== void 0 ? _flags_adDetect : false,
|
|
1723
|
+
capture_at: captureAt
|
|
1724
|
+
}, context.inputStreamType ? {
|
|
1725
|
+
input_stream_type: context.inputStreamType
|
|
1726
|
+
} : {})
|
|
1712
1727
|
];
|
|
1713
1728
|
}
|
|
1714
1729
|
});
|
|
1715
1730
|
}).apply(this, arguments);
|
|
1716
1731
|
}
|
|
1732
|
+
function publishTracking(licenseKey, channel, body) {
|
|
1733
|
+
ensureMQTTClient();
|
|
1734
|
+
publishMQTT(buildPlayerTopic(licenseKey, channel), body);
|
|
1735
|
+
}
|
|
1717
1736
|
function sendInitialTracking(_0) {
|
|
1718
1737
|
return _async_to_generator(function(licenseKey) {
|
|
1719
|
-
var context,
|
|
1738
|
+
var context, metricEvent, error;
|
|
1720
1739
|
var _arguments = arguments;
|
|
1721
1740
|
return _ts_generator(this, function(_state) {
|
|
1722
1741
|
switch(_state.label){
|
|
1723
1742
|
case 0:
|
|
1724
1743
|
context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
|
|
1744
|
+
if (!canPublish(licenseKey)) return [
|
|
1745
|
+
2
|
|
1746
|
+
];
|
|
1725
1747
|
_state.label = 1;
|
|
1726
1748
|
case 1:
|
|
1727
1749
|
_state.trys.push([
|
|
1728
1750
|
1,
|
|
1729
|
-
|
|
1751
|
+
3,
|
|
1730
1752
|
,
|
|
1731
|
-
|
|
1753
|
+
4
|
|
1732
1754
|
]);
|
|
1733
|
-
clientInfo = getClientInfo();
|
|
1734
|
-
return [
|
|
1735
|
-
4,
|
|
1736
|
-
getBrowserID(clientInfo)
|
|
1737
|
-
];
|
|
1738
|
-
case 2:
|
|
1739
|
-
browserId = _state.sent();
|
|
1740
|
-
trackingData = _object_spread({
|
|
1741
|
-
browserId: browserId
|
|
1742
|
-
}, clientInfo);
|
|
1743
1755
|
return [
|
|
1744
1756
|
4,
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
player_id: browserId,
|
|
1749
|
-
device_type: clientInfo.deviceType,
|
|
1750
|
-
input_stream_type: context.inputStreamType,
|
|
1751
|
-
os: clientInfo.os,
|
|
1752
|
-
ad_loaded: false,
|
|
1753
|
-
ad_detect: false,
|
|
1754
|
-
license_key: licenseKey,
|
|
1755
|
-
capture_at: /* @__PURE__ */ new Date().toISOString()
|
|
1756
|
-
}
|
|
1757
|
-
],
|
|
1758
|
-
trackingData: trackingData
|
|
1757
|
+
buildPlayerMetricEvent(context, {
|
|
1758
|
+
adLoaded: false,
|
|
1759
|
+
adDetect: false
|
|
1759
1760
|
})
|
|
1760
1761
|
];
|
|
1761
|
-
case
|
|
1762
|
-
_state.sent();
|
|
1762
|
+
case 2:
|
|
1763
|
+
metricEvent = _state.sent();
|
|
1764
|
+
publishTracking(licenseKey, "metrics", {
|
|
1765
|
+
events: [
|
|
1766
|
+
metricEvent
|
|
1767
|
+
]
|
|
1768
|
+
});
|
|
1763
1769
|
return [
|
|
1764
1770
|
3,
|
|
1765
|
-
|
|
1771
|
+
4
|
|
1766
1772
|
];
|
|
1767
|
-
case
|
|
1773
|
+
case 3:
|
|
1768
1774
|
error = _state.sent();
|
|
1769
1775
|
console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
|
|
1770
1776
|
return [
|
|
1771
1777
|
3,
|
|
1772
|
-
|
|
1778
|
+
4
|
|
1773
1779
|
];
|
|
1774
|
-
case
|
|
1780
|
+
case 4:
|
|
1775
1781
|
return [
|
|
1776
1782
|
2
|
|
1777
1783
|
];
|
|
@@ -1875,53 +1881,48 @@ function sendAdImpressionTracking(_0, _1) {
|
|
|
1875
1881
|
switch(_state.label){
|
|
1876
1882
|
case 0:
|
|
1877
1883
|
context = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
|
|
1884
|
+
if (!canPublish(licenseKey)) return [
|
|
1885
|
+
2
|
|
1886
|
+
];
|
|
1878
1887
|
_state.label = 1;
|
|
1879
1888
|
case 1:
|
|
1880
1889
|
_state.trys.push([
|
|
1881
1890
|
1,
|
|
1882
|
-
|
|
1891
|
+
3,
|
|
1883
1892
|
,
|
|
1884
|
-
|
|
1893
|
+
4
|
|
1885
1894
|
]);
|
|
1886
1895
|
return [
|
|
1887
1896
|
4,
|
|
1888
|
-
buildPlayerMetricEvent(
|
|
1897
|
+
buildPlayerMetricEvent(context, {
|
|
1889
1898
|
captureAt: adImpressionInfo.timestamp
|
|
1890
1899
|
})
|
|
1891
1900
|
];
|
|
1892
1901
|
case 2:
|
|
1893
1902
|
metricEvent = _state.sent();
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
capture_at: adImpressionInfo.timestamp
|
|
1906
|
-
}
|
|
1907
|
-
]
|
|
1908
|
-
})
|
|
1909
|
-
])
|
|
1910
|
-
];
|
|
1911
|
-
case 3:
|
|
1912
|
-
_state.sent();
|
|
1903
|
+
publishTracking(licenseKey, "heartbeat", metricEvent);
|
|
1904
|
+
publishTracking(licenseKey, "impressions", {
|
|
1905
|
+
events: [
|
|
1906
|
+
{
|
|
1907
|
+
player_id: metricEvent.player_id,
|
|
1908
|
+
ad_played_count: 1,
|
|
1909
|
+
ad_url: adImpressionInfo.adUrl,
|
|
1910
|
+
capture_at: adImpressionInfo.timestamp
|
|
1911
|
+
}
|
|
1912
|
+
]
|
|
1913
|
+
});
|
|
1913
1914
|
return [
|
|
1914
1915
|
3,
|
|
1915
|
-
|
|
1916
|
+
4
|
|
1916
1917
|
];
|
|
1917
|
-
case
|
|
1918
|
+
case 3:
|
|
1918
1919
|
error = _state.sent();
|
|
1919
1920
|
console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
|
|
1920
1921
|
return [
|
|
1921
1922
|
3,
|
|
1922
|
-
|
|
1923
|
+
4
|
|
1923
1924
|
];
|
|
1924
|
-
case
|
|
1925
|
+
case 4:
|
|
1925
1926
|
return [
|
|
1926
1927
|
2
|
|
1927
1928
|
];
|
|
@@ -1937,38 +1938,36 @@ function sendHeartbeat(_0) {
|
|
|
1937
1938
|
switch(_state.label){
|
|
1938
1939
|
case 0:
|
|
1939
1940
|
context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {}, flags = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
|
|
1941
|
+
if (!canPublish(licenseKey)) return [
|
|
1942
|
+
2
|
|
1943
|
+
];
|
|
1940
1944
|
_state.label = 1;
|
|
1941
1945
|
case 1:
|
|
1942
1946
|
_state.trys.push([
|
|
1943
1947
|
1,
|
|
1944
|
-
|
|
1948
|
+
3,
|
|
1945
1949
|
,
|
|
1946
|
-
|
|
1950
|
+
4
|
|
1947
1951
|
]);
|
|
1948
1952
|
return [
|
|
1949
1953
|
4,
|
|
1950
|
-
buildPlayerMetricEvent(
|
|
1954
|
+
buildPlayerMetricEvent(context, flags)
|
|
1951
1955
|
];
|
|
1952
1956
|
case 2:
|
|
1953
1957
|
heartbeatData = _state.sent();
|
|
1954
|
-
|
|
1955
|
-
4,
|
|
1956
|
-
postJson(HEARTBEAT_URL, licenseKey, heartbeatData)
|
|
1957
|
-
];
|
|
1958
|
-
case 3:
|
|
1959
|
-
_state.sent();
|
|
1958
|
+
publishTracking(licenseKey, "heartbeat", heartbeatData);
|
|
1960
1959
|
return [
|
|
1961
1960
|
3,
|
|
1962
|
-
|
|
1961
|
+
4
|
|
1963
1962
|
];
|
|
1964
|
-
case
|
|
1963
|
+
case 3:
|
|
1965
1964
|
error = _state.sent();
|
|
1966
1965
|
console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
|
|
1967
1966
|
return [
|
|
1968
1967
|
3,
|
|
1969
|
-
|
|
1968
|
+
4
|
|
1970
1969
|
];
|
|
1971
|
-
case
|
|
1970
|
+
case 4:
|
|
1972
1971
|
return [
|
|
1973
1972
|
2
|
|
1974
1973
|
];
|
|
@@ -2591,7 +2590,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
2591
2590
|
var _level_details, _level_details1;
|
|
2592
2591
|
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";
|
|
2593
2592
|
})) !== null && _ref !== void 0 ? _ref : false;
|
|
2594
|
-
if (!this.isLiveStream && this.vmapBreaks.length === 0 && this.apiVastTagUrl) {
|
|
2593
|
+
if (!this.isVmapEnabled() && !this.isLiveStream && this.vmapBreaks.length === 0 && this.apiVastTagUrl) {
|
|
2595
2594
|
prerollKey = "synthetic-vod-preroll";
|
|
2596
2595
|
if (!this.consumedVmapBreakIds.has(prerollKey)) {
|
|
2597
2596
|
this.vmapBreaks = [
|
|
@@ -3176,12 +3175,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
3176
3175
|
_this.palNonce.sendPlaybackStart();
|
|
3177
3176
|
}
|
|
3178
3177
|
});
|
|
3179
|
-
this.
|
|
3178
|
+
this.endedHandler = function() {
|
|
3180
3179
|
if (_this.palPlaybackStarted) {
|
|
3181
3180
|
_this.palPlaybackStarted = false;
|
|
3182
3181
|
_this.palNonce.sendPlaybackEnd();
|
|
3183
3182
|
}
|
|
3184
|
-
|
|
3183
|
+
_this.onVideoEnded();
|
|
3184
|
+
};
|
|
3185
|
+
this.video.addEventListener("ended", this.endedHandler);
|
|
3185
3186
|
this.video.addEventListener("mousedown", function(e) {
|
|
3186
3187
|
_this.palNonce.sendAdTouch(e);
|
|
3187
3188
|
});
|
|
@@ -4503,6 +4504,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4503
4504
|
}
|
|
4504
4505
|
}
|
|
4505
4506
|
},
|
|
4507
|
+
{
|
|
4508
|
+
key: "isVmapEnabled",
|
|
4509
|
+
value: function isVmapEnabled() {
|
|
4510
|
+
var _this_config_vmapUrl;
|
|
4511
|
+
return !!(this.config.isVmap && ((_this_config_vmapUrl = this.config.vmapUrl) === null || _this_config_vmapUrl === void 0 ? void 0 : _this_config_vmapUrl.trim()));
|
|
4512
|
+
}
|
|
4513
|
+
},
|
|
4506
4514
|
{
|
|
4507
4515
|
key: "fetchAdConfiguration",
|
|
4508
4516
|
value: function fetchAdConfiguration() {
|
|
@@ -4511,7 +4519,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4511
4519
|
return _ts_generator(this, function(_state) {
|
|
4512
4520
|
switch(_state.label){
|
|
4513
4521
|
case 0:
|
|
4514
|
-
if (!this.
|
|
4522
|
+
if (!this.isVmapEnabled()) return [
|
|
4515
4523
|
3,
|
|
4516
4524
|
2
|
|
4517
4525
|
];
|
|
@@ -4521,7 +4529,12 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4521
4529
|
];
|
|
4522
4530
|
case 1:
|
|
4523
4531
|
_state.sent();
|
|
4524
|
-
|
|
4532
|
+
if (this.config.debugAdTiming) {
|
|
4533
|
+
console.log("[StormcloudVideoPlayer] VMAP mode enabled");
|
|
4534
|
+
}
|
|
4535
|
+
return [
|
|
4536
|
+
2
|
|
4537
|
+
];
|
|
4525
4538
|
case 2:
|
|
4526
4539
|
vastMode = this.config.vastMode || "default";
|
|
4527
4540
|
if (this.config.debugAdTiming) {
|
|
@@ -4689,7 +4702,16 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4689
4702
|
}
|
|
4690
4703
|
return [];
|
|
4691
4704
|
}
|
|
4692
|
-
var
|
|
4705
|
+
var VMAP_NS = "http://www.iab.net/videosuite/vmap";
|
|
4706
|
+
var adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, "AdBreak"));
|
|
4707
|
+
if (adBreakNodes.length === 0) {
|
|
4708
|
+
adBreakNodes = Array.from(doc.querySelectorAll("AdBreak, vmap\\:AdBreak"));
|
|
4709
|
+
}
|
|
4710
|
+
if (adBreakNodes.length === 0) {
|
|
4711
|
+
adBreakNodes = Array.from(doc.getElementsByTagName("*")).filter(function(el) {
|
|
4712
|
+
return el.localName === "AdBreak";
|
|
4713
|
+
});
|
|
4714
|
+
}
|
|
4693
4715
|
var parsed = [];
|
|
4694
4716
|
adBreakNodes.forEach(function(node, index) {
|
|
4695
4717
|
var timeOffsetRaw = (node.getAttribute("timeOffset") || "").trim();
|
|
@@ -4697,7 +4719,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4697
4719
|
if (startTimeMs == null) {
|
|
4698
4720
|
return;
|
|
4699
4721
|
}
|
|
4700
|
-
var adTagNode = node.
|
|
4722
|
+
var adTagNode = node.getElementsByTagNameNS(VMAP_NS, "AdTagURI")[0];
|
|
4723
|
+
if (!adTagNode) {
|
|
4724
|
+
var _node_querySelector;
|
|
4725
|
+
adTagNode = (_node_querySelector = node.querySelector("AdTagURI, vmap\\:AdTagURI")) !== null && _node_querySelector !== void 0 ? _node_querySelector : void 0;
|
|
4726
|
+
}
|
|
4701
4727
|
var adTagUrl = ((adTagNode === null || adTagNode === void 0 ? void 0 : adTagNode.textContent) || "").trim();
|
|
4702
4728
|
if (!adTagUrl) {
|
|
4703
4729
|
return;
|
|
@@ -6254,23 +6280,49 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6254
6280
|
key: "onTimeUpdate",
|
|
6255
6281
|
value: function onTimeUpdate(currentTimeSec) {
|
|
6256
6282
|
var _this = this;
|
|
6283
|
+
if (!this.isVmapEnabled() || this.vmapBreaks.length === 0) {
|
|
6284
|
+
return;
|
|
6285
|
+
}
|
|
6257
6286
|
if (this.adPlayer.isAdPlaying() || this.inAdBreak) return;
|
|
6258
6287
|
var nowMs = currentTimeSec * 1e3;
|
|
6259
6288
|
var breakToPlay = this.findBreakForTime(nowMs);
|
|
6260
6289
|
if (breakToPlay) {
|
|
6261
|
-
void this.
|
|
6290
|
+
void this.handleVmapAdBreak(breakToPlay, nowMs).catch(function(error) {
|
|
6262
6291
|
if (_this.config.debugAdTiming) {
|
|
6263
|
-
console.warn("[StormcloudVideoPlayer]
|
|
6292
|
+
console.warn("[StormcloudVideoPlayer] VMAP ad break failed gracefully:", error);
|
|
6264
6293
|
}
|
|
6265
6294
|
});
|
|
6266
6295
|
}
|
|
6267
6296
|
}
|
|
6268
6297
|
},
|
|
6269
6298
|
{
|
|
6270
|
-
key: "
|
|
6271
|
-
value: function
|
|
6299
|
+
key: "onVideoEnded",
|
|
6300
|
+
value: function onVideoEnded() {
|
|
6301
|
+
var _this = this;
|
|
6302
|
+
if (!this.isVmapEnabled() || this.vmapBreaks.length === 0) {
|
|
6303
|
+
return;
|
|
6304
|
+
}
|
|
6305
|
+
if (this.adPlayer.isAdPlaying() || this.inAdBreak) {
|
|
6306
|
+
return;
|
|
6307
|
+
}
|
|
6308
|
+
var durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;
|
|
6309
|
+
var postroll = this.vmapBreaks.find(function(b) {
|
|
6310
|
+
return b.startTimeMs === -1 && !_this.consumedVmapBreakIds.has(_this.getAdBreakKey(b));
|
|
6311
|
+
});
|
|
6312
|
+
if (postroll) {
|
|
6313
|
+
void this.handleVmapAdBreak(postroll, durationMs).catch(function(error) {
|
|
6314
|
+
if (_this.config.debugAdTiming) {
|
|
6315
|
+
console.warn("[StormcloudVideoPlayer] VMAP post-roll failed gracefully:", error);
|
|
6316
|
+
}
|
|
6317
|
+
});
|
|
6318
|
+
}
|
|
6319
|
+
}
|
|
6320
|
+
},
|
|
6321
|
+
{
|
|
6322
|
+
key: "handleVmapAdBreak",
|
|
6323
|
+
value: function handleVmapAdBreak(adBreak, nowMs) {
|
|
6272
6324
|
return _async_to_generator(function() {
|
|
6273
|
-
var _adBreak_durationMs,
|
|
6325
|
+
var _adBreak_durationMs, key, breakStartMs, durationMs, endMs, inWindow, tags, first, rest, error;
|
|
6274
6326
|
return _ts_generator(this, function(_state) {
|
|
6275
6327
|
switch(_state.label){
|
|
6276
6328
|
case 0:
|
|
@@ -6288,25 +6340,28 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6288
6340
|
}
|
|
6289
6341
|
durationMs = (_adBreak_durationMs = adBreak.durationMs) !== null && _adBreak_durationMs !== void 0 ? _adBreak_durationMs : 0;
|
|
6290
6342
|
endMs = breakStartMs + durationMs;
|
|
6291
|
-
|
|
6292
|
-
inWindow = durationMs > 0 ? nowMs > breakStartMs && nowMs < endMs : nowMs + tol >= breakStartMs;
|
|
6343
|
+
inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;
|
|
6293
6344
|
if (!inWindow) return [
|
|
6294
6345
|
3,
|
|
6295
6346
|
4
|
|
6296
6347
|
];
|
|
6297
6348
|
this.consumedVmapBreakIds.add(key);
|
|
6298
|
-
|
|
6299
|
-
|
|
6300
|
-
|
|
6301
|
-
|
|
6302
|
-
|
|
6303
|
-
|
|
6304
|
-
4
|
|
6305
|
-
];
|
|
6349
|
+
tags = this.selectVastTagsForBreak(adBreak);
|
|
6350
|
+
if (!tags || tags.length === 0) {
|
|
6351
|
+
return [
|
|
6352
|
+
2
|
|
6353
|
+
];
|
|
6354
|
+
}
|
|
6306
6355
|
first = tags[0];
|
|
6307
6356
|
rest = tags.slice(1);
|
|
6308
6357
|
this.adPodQueue = rest;
|
|
6309
6358
|
this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);
|
|
6359
|
+
this.showAds = true;
|
|
6360
|
+
this.inAdBreak = true;
|
|
6361
|
+
this.currentAdBreakStartWallClockMs = Date.now();
|
|
6362
|
+
if (!this.video.paused) {
|
|
6363
|
+
this.video.pause();
|
|
6364
|
+
}
|
|
6310
6365
|
_state.label = 1;
|
|
6311
6366
|
case 1:
|
|
6312
6367
|
_state.trys.push([
|
|
@@ -6321,10 +6376,6 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6321
6376
|
];
|
|
6322
6377
|
case 2:
|
|
6323
6378
|
_state.sent();
|
|
6324
|
-
this.inAdBreak = true;
|
|
6325
|
-
this.expectedAdBreakDurationMs = remainingMs;
|
|
6326
|
-
this.currentAdBreakStartWallClockMs = Date.now();
|
|
6327
|
-
this.scheduleAdStopCountdown(remainingMs);
|
|
6328
6379
|
return [
|
|
6329
6380
|
3,
|
|
6330
6381
|
4
|
|
@@ -6332,8 +6383,10 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
6332
6383
|
case 3:
|
|
6333
6384
|
error = _state.sent();
|
|
6334
6385
|
this.adPodQueue = [];
|
|
6386
|
+
this.inAdBreak = false;
|
|
6387
|
+
this.showAds = false;
|
|
6335
6388
|
if (this.config.debugAdTiming) {
|
|
6336
|
-
console.warn("[StormcloudVideoPlayer]
|
|
6389
|
+
console.warn("[StormcloudVideoPlayer] VMAP ad request failed:", error);
|
|
6337
6390
|
}
|
|
6338
6391
|
return [
|
|
6339
6392
|
3,
|
|
@@ -7045,9 +7098,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
7045
7098
|
{
|
|
7046
7099
|
key: "findBreakForTime",
|
|
7047
7100
|
value: function findBreakForTime(nowMs) {
|
|
7048
|
-
var _this_config_driftToleranceMs;
|
|
7049
7101
|
var schedule = this.vmapBreaks;
|
|
7050
|
-
var tol = (_this_config_driftToleranceMs = this.config.driftToleranceMs) !== null && _this_config_driftToleranceMs !== void 0 ? _this_config_driftToleranceMs : 1e3;
|
|
7051
7102
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
7052
7103
|
try {
|
|
7053
7104
|
for(var _iterator = schedule[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
@@ -7059,9 +7110,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
7059
7110
|
if (breakStartMs == null) {
|
|
7060
7111
|
continue;
|
|
7061
7112
|
}
|
|
7062
|
-
|
|
7063
|
-
|
|
7064
|
-
|
|
7113
|
+
if (b.durationMs) {
|
|
7114
|
+
var end = breakStartMs + b.durationMs;
|
|
7115
|
+
if (nowMs >= breakStartMs && nowMs < end) {
|
|
7116
|
+
return b;
|
|
7117
|
+
}
|
|
7118
|
+
continue;
|
|
7119
|
+
}
|
|
7120
|
+
if (nowMs >= breakStartMs) {
|
|
7065
7121
|
return b;
|
|
7066
7122
|
}
|
|
7067
7123
|
}
|
|
@@ -7269,6 +7325,10 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
7269
7325
|
this.video.removeEventListener("timeupdate", this.timeUpdateHandler);
|
|
7270
7326
|
delete this.timeUpdateHandler;
|
|
7271
7327
|
}
|
|
7328
|
+
if (this.endedHandler) {
|
|
7329
|
+
this.video.removeEventListener("ended", this.endedHandler);
|
|
7330
|
+
delete this.endedHandler;
|
|
7331
|
+
}
|
|
7272
7332
|
if (this.emptiedHandler) {
|
|
7273
7333
|
this.video.removeEventListener("emptied", this.emptiedHandler);
|
|
7274
7334
|
delete this.emptiedHandler;
|
|
@@ -7299,6 +7359,7 @@ var CRITICAL_PROPS = [
|
|
|
7299
7359
|
"allowNativeHls",
|
|
7300
7360
|
"isLiveStream",
|
|
7301
7361
|
"licenseKey",
|
|
7362
|
+
"isVmap",
|
|
7302
7363
|
"vmapUrl",
|
|
7303
7364
|
"lowLatencyMode",
|
|
7304
7365
|
"driftToleranceMs",
|
|
@@ -7307,7 +7368,7 @@ var CRITICAL_PROPS = [
|
|
|
7307
7368
|
var CONTROLS_HIDE_DELAY = 3e3;
|
|
7308
7369
|
var DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;
|
|
7309
7370
|
var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
|
|
7310
|
-
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, [
|
|
7371
|
+
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, [
|
|
7311
7372
|
"src",
|
|
7312
7373
|
"autoplay",
|
|
7313
7374
|
"muted",
|
|
@@ -7335,6 +7396,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
|
|
|
7335
7396
|
"licenseKey",
|
|
7336
7397
|
"vastMode",
|
|
7337
7398
|
"vastTagUrl",
|
|
7399
|
+
"isVmap",
|
|
7338
7400
|
"vmapUrl",
|
|
7339
7401
|
"minSegmentsBeforePlay"
|
|
7340
7402
|
]);
|
|
@@ -7477,6 +7539,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
|
|
|
7477
7539
|
allowNativeHls,
|
|
7478
7540
|
isLiveStream,
|
|
7479
7541
|
licenseKey,
|
|
7542
|
+
isVmap,
|
|
7480
7543
|
vmapUrl,
|
|
7481
7544
|
lowLatencyMode,
|
|
7482
7545
|
driftToleranceMs,
|
|
@@ -7521,6 +7584,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
|
|
|
7521
7584
|
if (licenseKey !== void 0) cfg.licenseKey = licenseKey;
|
|
7522
7585
|
if (vastMode !== void 0) cfg.vastMode = vastMode;
|
|
7523
7586
|
if (vastTagUrl !== void 0) cfg.vastTagUrl = vastTagUrl;
|
|
7587
|
+
if (isVmap !== void 0) cfg.isVmap = isVmap;
|
|
7524
7588
|
if (vmapUrl !== void 0) cfg.vmapUrl = vmapUrl;
|
|
7525
7589
|
if (minSegmentsBeforePlay !== void 0) cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;
|
|
7526
7590
|
var player = new StormcloudVideoPlayer(cfg);
|