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/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, hashArray, hashHex, error, hash, i1, char, fallbackHash, timestamp, random;
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 && crypto.subtle.digest)) return [
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
- hashArray = Array.from(new Uint8Array(hashBuffer));
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
- error = _state.sent();
1564
- console.warn("[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash");
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
- var PLAYER_TRACKING_BASE_URL = "https://adstorm.co/api-adstorm-dev/adstorm/player-tracking";
1589
- var TRACK_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/metrics/ingest");
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 postJson(url, licenseKey, body) {
1707
+ function buildPlayerMetricEvent() {
1634
1708
  return _async_to_generator(function() {
1635
- var response;
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 > 1 && _arguments[1] !== void 0 ? _arguments[1] : {}, flags = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
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
- browserId = _state.sent();
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: browserId,
1685
- browserId: browserId,
1725
+ _object_spread({
1726
+ player_id: playerId,
1686
1727
  device_type: clientInfo.deviceType,
1687
- deviceType: clientInfo.deviceType,
1688
- input_stream_type: context.inputStreamType,
1689
- os: clientInfo.os,
1690
- ad_loaded: flags.adLoaded,
1691
- ad_detect: flags.adDetect,
1692
- license_key: licenseKey,
1693
- capture_at: captureAt,
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, clientInfo, browserId, trackingData, error;
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
- 4,
1759
+ 3,
1714
1760
  ,
1715
- 5
1761
+ 4
1716
1762
  ]);
1717
- clientInfo = getClientInfo();
1718
1763
  return [
1719
1764
  4,
1720
- getBrowserID(clientInfo)
1721
- ];
1722
- case 2:
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 3:
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
- 5
1779
+ 4
1750
1780
  ];
1751
- case 4:
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
- 5
1786
+ 4
1757
1787
  ];
1758
- case 5:
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
- 4,
1899
+ 3,
1867
1900
  ,
1868
- 5
1901
+ 4
1869
1902
  ]);
1870
1903
  return [
1871
1904
  4,
1872
- buildPlayerMetricEvent(licenseKey, context, {
1905
+ buildPlayerMetricEvent(context, {
1873
1906
  captureAt: adImpressionInfo.timestamp
1874
1907
  })
1875
1908
  ];
1876
1909
  case 2:
1877
1910
  metricEvent = _state.sent();
1878
- return [
1879
- 4,
1880
- Promise.all([
1881
- postJson(HEARTBEAT_URL, licenseKey, metricEvent),
1882
- postJson(IMPRESSIONS_URL, licenseKey, {
1883
- events: [
1884
- {
1885
- player_id: metricEvent.player_id,
1886
- ad_played_count: 1,
1887
- ad_url: adImpressionInfo.adUrl,
1888
- license_key: licenseKey,
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
- 5
1924
+ 4
1900
1925
  ];
1901
- case 4:
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
- 5
1931
+ 4
1907
1932
  ];
1908
- case 5:
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
- 4,
1956
+ 3,
1929
1957
  ,
1930
- 5
1958
+ 4
1931
1959
  ]);
1932
1960
  return [
1933
1961
  4,
1934
- buildPlayerMetricEvent(licenseKey, context, flags)
1962
+ buildPlayerMetricEvent(context, flags)
1935
1963
  ];
1936
1964
  case 2:
1937
1965
  heartbeatData = _state.sent();
1938
- return [
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
- 5
1969
+ 4
1947
1970
  ];
1948
- case 4:
1971
+ case 3:
1949
1972
  error = _state.sent();
1950
1973
  console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
1951
1974
  return [
1952
1975
  3,
1953
- 5
1976
+ 4
1954
1977
  ];
1955
- case 5:
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.video.addEventListener("ended", function() {
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.config.vmapUrl) return [
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
- _state.label = 2;
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 adBreakNodes = Array.from(doc.querySelectorAll("AdBreak, vmap\\:AdBreak"));
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.querySelector("AdTagURI, vmap\\:AdTagURI");
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
- var timestamp = baseTimestamp + i;
4813
- var random = Math.floor(Math.random() * 1e12);
4814
- var uniqueCorrelator = "".concat(timestamp, "_").concat(random, "_").concat(i);
4815
- var urlWithCorrelator = void 0;
4816
- var correlatorRegex = /([?&])correlator=([^&]*)/;
4817
- if (correlatorRegex.test(baseUrl)) {
4818
- urlWithCorrelator = baseUrl.replace(correlatorRegex, "$1correlator=".concat(uniqueCorrelator));
4819
- } else if (baseUrl.includes("?")) {
4820
- urlWithCorrelator = "".concat(baseUrl, "&correlator=").concat(uniqueCorrelator);
4821
- } else {
4822
- urlWithCorrelator = "".concat(baseUrl, "?correlator=").concat(uniqueCorrelator);
4823
- }
4824
- urls.push(this.palNonce.injectNonce(urlWithCorrelator));
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.handleMidAdJoin(breakToPlay, nowMs).catch(function(error) {
6510
+ void this.handleVmapAdBreak(breakToPlay, nowMs).catch(function(error) {
6272
6511
  if (_this.config.debugAdTiming) {
6273
- console.warn("[StormcloudVideoPlayer] Mid-roll VMAP join failed gracefully:", error);
6512
+ console.warn("[StormcloudVideoPlayer] VMAP ad break failed gracefully:", error);
6274
6513
  }
6275
6514
  });
6276
6515
  }
6277
6516
  }
6278
6517
  },
6279
6518
  {
6280
- key: "handleMidAdJoin",
6281
- value: function handleMidAdJoin(adBreak, nowMs) {
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, _this_config_driftToleranceMs, key, breakStartMs, durationMs, endMs, tol, inWindow, remainingMs, tags, first, rest, error;
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
- tol = (_this_config_driftToleranceMs = this.config.driftToleranceMs) !== null && _this_config_driftToleranceMs !== void 0 ? _this_config_driftToleranceMs : 1e3;
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
- remainingMs = durationMs > 0 ? Math.max(0, endMs - nowMs) : 0;
6309
- tags = this.selectVastTagsForBreak(adBreak) || (this.apiVastTagUrl ? [
6310
- this.apiVastTagUrl
6311
- ] : void 0);
6312
- if (!(tags && tags.length > 0)) return [
6313
- 3,
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] Mid-roll VMAP ad request failed:", error);
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
- var end = breakStartMs + (b.durationMs || 0);
7073
- var effectiveTol = breakStartMs === 0 ? Math.max(tol, 3e4) : tol;
7074
- if (nowMs >= breakStartMs && (b.durationMs ? nowMs < end : nowMs <= breakStartMs + effectiveTol)) {
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