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.cjs CHANGED
@@ -428,6 +428,9 @@ var __toCommonJS = function __toCommonJS(mod) {
428
428
  // src/index.ts
429
429
  var index_exports = {};
430
430
  __export(index_exports, {
431
+ DEFAULT_MQTT_CONFIG: function DEFAULT_MQTT_CONFIG1() {
432
+ return DEFAULT_MQTT_CONFIG;
433
+ },
431
434
  IS_BROWSER: function IS_BROWSER1() {
432
435
  return IS_BROWSER;
433
436
  },
@@ -440,6 +443,9 @@ __export(index_exports, {
440
443
  IS_SAFARI: function IS_SAFARI1() {
441
444
  return IS_SAFARI;
442
445
  },
446
+ MQTT_CA_CERT_FILE: function MQTT_CA_CERT_FILE1() {
447
+ return MQTT_CA_CERT_FILE;
448
+ },
443
449
  SUPPORTS_DASH: function SUPPORTS_DASH1() {
444
450
  return SUPPORTS_DASH;
445
451
  },
@@ -455,9 +461,21 @@ __export(index_exports, {
455
461
  StormcloudVideoPlayerComponent: function StormcloudVideoPlayerComponent1() {
456
462
  return StormcloudVideoPlayerComponent;
457
463
  },
464
+ applyMQTTConfig: function applyMQTTConfig1() {
465
+ return applyMQTTConfig;
466
+ },
467
+ buildMQTTBrokerUrl: function buildMQTTBrokerUrl1() {
468
+ return buildMQTTBrokerUrl;
469
+ },
470
+ buildPlayerTopic: function buildPlayerTopic1() {
471
+ return buildPlayerTopic;
472
+ },
458
473
  canPlay: function canPlay1() {
459
474
  return canPlay;
460
475
  },
476
+ configureMQTT: function configureMQTT1() {
477
+ return configureMQTT;
478
+ },
461
479
  createHlsAdPlayer: function createHlsAdPlayer1() {
462
480
  return createHlsAdPlayer;
463
481
  },
@@ -473,6 +491,12 @@ __export(index_exports, {
473
491
  detectBrowser: function detectBrowser1() {
474
492
  return detectBrowser;
475
493
  },
494
+ disconnectMQTT: function disconnectMQTT1() {
495
+ return disconnectMQTT;
496
+ },
497
+ ensureMQTTClient: function ensureMQTTClient1() {
498
+ return ensureMQTTClient;
499
+ },
476
500
  getBrowserConfigOverrides: function getBrowserConfigOverrides1() {
477
501
  return getBrowserConfigOverrides;
478
502
  },
@@ -482,9 +506,24 @@ __export(index_exports, {
482
506
  getClientInfo: function getClientInfo1() {
483
507
  return getClientInfo;
484
508
  },
509
+ getMQTTStatus: function getMQTTStatus1() {
510
+ return getMQTTStatus;
511
+ },
512
+ initMQTTClient: function initMQTTClient1() {
513
+ return initMQTTClient;
514
+ },
485
515
  initializePolyfills: function initializePolyfills1() {
486
516
  return initializePolyfills;
487
517
  },
518
+ isMQTTConfigured: function isMQTTConfigured1() {
519
+ return isMQTTConfigured;
520
+ },
521
+ isMQTTConnected: function isMQTTConnected1() {
522
+ return isMQTTConnected;
523
+ },
524
+ isMQTTEnabled: function isMQTTEnabled1() {
525
+ return isMQTTEnabled;
526
+ },
488
527
  isMediaStream: function isMediaStream1() {
489
528
  return isMediaStream;
490
529
  },
@@ -497,6 +536,9 @@ __export(index_exports, {
497
536
  merge: function merge1() {
498
537
  return merge;
499
538
  },
539
+ mqttConfig: function mqttConfig1() {
540
+ return mqttConfig;
541
+ },
500
542
  omit: function omit1() {
501
543
  return omit;
502
544
  },
@@ -506,6 +548,9 @@ __export(index_exports, {
506
548
  players: function players() {
507
549
  return players_default;
508
550
  },
551
+ publishMQTT: function publishMQTT1() {
552
+ return publishMQTT;
553
+ },
509
554
  randomString: function randomString1() {
510
555
  return randomString;
511
556
  },
@@ -1524,6 +1569,123 @@ function createPalNonceManager() {
1524
1569
  }
1525
1570
  };
1526
1571
  }
1572
+ // src/utils/mqttConfig.ts
1573
+ var MQTT_CA_CERT_FILE = "src/certs/emqxsl-ca.crt";
1574
+ var DEFAULT_MQTT_CONFIG = {
1575
+ enabled: true,
1576
+ brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
1577
+ brokerPort: 8883,
1578
+ wsPort: 8084,
1579
+ username: "for-sonifi",
1580
+ password: "sonifi-mqtt",
1581
+ topicPrefix: "adstorm/players",
1582
+ qos: 1
1583
+ };
1584
+ var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
1585
+ function applyMQTTConfig(overrides) {
1586
+ Object.assign(mqttConfig, overrides);
1587
+ }
1588
+ function isMQTTEnabled() {
1589
+ return mqttConfig.enabled;
1590
+ }
1591
+ function buildMQTTBrokerUrl() {
1592
+ if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
1593
+ return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
1594
+ }
1595
+ function buildPlayerTopic(licenseKey, channel) {
1596
+ return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
1597
+ }
1598
+ // src/utils/mqttClient.ts
1599
+ var import_mqtt = __toESM(require("mqtt"), 1);
1600
+ var LOG = "[StormcloudVideoPlayer][MQTT]";
1601
+ var client = null;
1602
+ var status = "disconnected";
1603
+ function getMQTTStatus() {
1604
+ return status;
1605
+ }
1606
+ function isMQTTConnected() {
1607
+ return status === "connected" && client !== null && client.connected;
1608
+ }
1609
+ function isMQTTConfigured() {
1610
+ return isMQTTEnabled();
1611
+ }
1612
+ function configureMQTT(overrides) {
1613
+ applyMQTTConfig(overrides);
1614
+ disconnectMQTT();
1615
+ }
1616
+ function initMQTTClient() {
1617
+ if (client || !isMQTTEnabled()) return;
1618
+ var url = buildMQTTBrokerUrl();
1619
+ status = "connecting";
1620
+ var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
1621
+ try {
1622
+ client = import_mqtt.default.connect(url, {
1623
+ clientId: clientId,
1624
+ username: mqttConfig.username,
1625
+ password: mqttConfig.password,
1626
+ keepalive: 60,
1627
+ clean: true,
1628
+ reconnectPeriod: 5e3,
1629
+ connectTimeout: 1e4,
1630
+ queueQoSZero: false
1631
+ });
1632
+ } catch (err) {
1633
+ status = "error";
1634
+ console.warn("".concat(LOG, " connect() threw:"), err);
1635
+ return;
1636
+ }
1637
+ client.on("connect", function() {
1638
+ status = "connected";
1639
+ console.info("".concat(LOG, " connected to ").concat(url));
1640
+ });
1641
+ client.on("reconnect", function() {
1642
+ status = "connecting";
1643
+ console.info("".concat(LOG, " reconnecting…"));
1644
+ });
1645
+ client.on("offline", function() {
1646
+ status = "disconnected";
1647
+ console.warn("".concat(LOG, " offline"));
1648
+ });
1649
+ client.on("error", function(err) {
1650
+ status = "error";
1651
+ console.warn("".concat(LOG, " error:"), err.message);
1652
+ });
1653
+ client.on("close", function() {
1654
+ if (status === "connected") {
1655
+ status = "disconnected";
1656
+ }
1657
+ });
1658
+ }
1659
+ function ensureMQTTClient() {
1660
+ if (isMQTTEnabled() && !client) {
1661
+ initMQTTClient();
1662
+ }
1663
+ }
1664
+ function publishMQTT(topic, payload) {
1665
+ if (!isMQTTEnabled()) {
1666
+ return false;
1667
+ }
1668
+ ensureMQTTClient();
1669
+ if (!client) {
1670
+ return false;
1671
+ }
1672
+ try {
1673
+ client.publish(topic, JSON.stringify(payload), {
1674
+ qos: mqttConfig.qos
1675
+ });
1676
+ return true;
1677
+ } catch (err) {
1678
+ console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
1679
+ return false;
1680
+ }
1681
+ }
1682
+ function disconnectMQTT() {
1683
+ if (client) {
1684
+ client.end(true);
1685
+ client = null;
1686
+ status = "disconnected";
1687
+ }
1688
+ }
1527
1689
  // src/utils/tracking.ts
1528
1690
  var cachedBrowserId = null;
1529
1691
  function getClientInfo() {
@@ -1670,7 +1832,7 @@ function getClientInfo() {
1670
1832
  }
1671
1833
  function getBrowserID(clientInfo) {
1672
1834
  return _async_to_generator(function() {
1673
- var fingerprintString, encodedData, utf8, buffer, i, hashBuffer, hashArray, hashHex, error, hash, i1, char, fallbackHash, timestamp, random;
1835
+ var _crypto_subtle, fingerprintString, encodedData, utf8, buffer, i, hashBuffer, hashHex, unused, hash, i1, char, fallbackHash, timestamp, random;
1674
1836
  return _ts_generator(this, function(_state) {
1675
1837
  switch(_state.label){
1676
1838
  case 0:
@@ -1681,7 +1843,7 @@ function getBrowserID(clientInfo) {
1681
1843
  ];
1682
1844
  }
1683
1845
  fingerprintString = JSON.stringify(clientInfo);
1684
- if (!(typeof crypto !== "undefined" && crypto.subtle && crypto.subtle.digest)) return [
1846
+ if (!(typeof crypto !== "undefined" && ((_crypto_subtle = crypto.subtle) === null || _crypto_subtle === void 0 ? void 0 : _crypto_subtle.digest))) return [
1685
1847
  3,
1686
1848
  5
1687
1849
  ];
@@ -1719,8 +1881,7 @@ function getBrowserID(clientInfo) {
1719
1881
  ];
1720
1882
  case 3:
1721
1883
  hashBuffer = _state.sent();
1722
- hashArray = Array.from(new Uint8Array(hashBuffer));
1723
- hashHex = hashArray.map(function(b) {
1884
+ hashHex = Array.from(new Uint8Array(hashBuffer)).map(function(b) {
1724
1885
  return b.toString(16).padStart(2, "0");
1725
1886
  }).join("");
1726
1887
  cachedBrowserId = hashHex;
@@ -1729,8 +1890,8 @@ function getBrowserID(clientInfo) {
1729
1890
  hashHex
1730
1891
  ];
1731
1892
  case 4:
1732
- error = _state.sent();
1733
- console.warn("[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash");
1893
+ unused = _state.sent();
1894
+ console.warn("[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash");
1734
1895
  return [
1735
1896
  3,
1736
1897
  5
@@ -1754,177 +1915,91 @@ function getBrowserID(clientInfo) {
1754
1915
  });
1755
1916
  })();
1756
1917
  }
1757
- var PLAYER_TRACKING_BASE_URL = "https://adstorm.co/api-adstorm-dev/adstorm/player-tracking";
1758
- var TRACK_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/metrics/ingest");
1759
- var HEARTBEAT_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/heartbeat");
1760
- var IMPRESSIONS_URL = "".concat(PLAYER_TRACKING_BASE_URL, "/impressions/ingest");
1761
- function buildHeaders(licenseKey) {
1762
- var headers = {
1763
- "Content-Type": "application/json"
1764
- };
1765
- if (licenseKey) {
1766
- headers["Authorization"] = "Bearer ".concat(licenseKey);
1767
- }
1768
- return headers;
1918
+ function canPublish(licenseKey) {
1919
+ return Boolean(isMQTTEnabled() && licenseKey);
1769
1920
  }
1770
- function sendTrackRequest(licenseKey, body) {
1921
+ function buildPlayerMetricEvent() {
1771
1922
  return _async_to_generator(function() {
1772
- var response;
1773
- return _ts_generator(this, function(_state) {
1774
- switch(_state.label){
1775
- case 0:
1776
- return [
1777
- 4,
1778
- fetch(TRACK_URL, {
1779
- method: "POST",
1780
- headers: buildHeaders(licenseKey),
1781
- body: JSON.stringify(body)
1782
- })
1783
- ];
1784
- case 1:
1785
- response = _state.sent();
1786
- if (!response.ok) {
1787
- throw new Error("HTTP error! status: ".concat(response.status));
1788
- }
1789
- return [
1790
- 4,
1791
- response.json()
1792
- ];
1793
- case 2:
1794
- _state.sent();
1795
- return [
1796
- 2
1797
- ];
1798
- }
1799
- });
1800
- })();
1801
- }
1802
- function postJson(url, licenseKey, body) {
1803
- return _async_to_generator(function() {
1804
- var response;
1805
- return _ts_generator(this, function(_state) {
1806
- switch(_state.label){
1807
- case 0:
1808
- return [
1809
- 4,
1810
- fetch(url, {
1811
- method: "POST",
1812
- headers: buildHeaders(licenseKey),
1813
- body: JSON.stringify(body)
1814
- })
1815
- ];
1816
- case 1:
1817
- response = _state.sent();
1818
- if (!response.ok) {
1819
- throw new Error("HTTP error! status: ".concat(response.status));
1820
- }
1821
- return [
1822
- 4,
1823
- response.json()
1824
- ];
1825
- case 2:
1826
- _state.sent();
1827
- return [
1828
- 2
1829
- ];
1830
- }
1831
- });
1832
- })();
1833
- }
1834
- function buildPlayerMetricEvent(_0) {
1835
- return _async_to_generator(function(licenseKey) {
1836
- var context, flags, _flags_captureAt, clientInfo, browserId, captureAt;
1923
+ var context, flags, _flags_captureAt, _flags_adLoaded, _flags_adDetect, clientInfo, playerId, captureAt;
1837
1924
  var _arguments = arguments;
1838
1925
  return _ts_generator(this, function(_state) {
1839
1926
  switch(_state.label){
1840
1927
  case 0:
1841
- context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {}, flags = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
1928
+ context = _arguments.length > 0 && _arguments[0] !== void 0 ? _arguments[0] : {}, flags = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
1842
1929
  clientInfo = getClientInfo();
1843
1930
  return [
1844
1931
  4,
1845
1932
  getBrowserID(clientInfo)
1846
1933
  ];
1847
1934
  case 1:
1848
- browserId = _state.sent();
1935
+ playerId = _state.sent();
1849
1936
  captureAt = (_flags_captureAt = flags.captureAt) !== null && _flags_captureAt !== void 0 ? _flags_captureAt : /* @__PURE__ */ new Date().toISOString();
1850
1937
  return [
1851
1938
  2,
1852
- {
1853
- player_id: browserId,
1854
- browserId: browserId,
1939
+ _object_spread({
1940
+ player_id: playerId,
1855
1941
  device_type: clientInfo.deviceType,
1856
- deviceType: clientInfo.deviceType,
1857
- input_stream_type: context.inputStreamType,
1858
- os: clientInfo.os,
1859
- ad_loaded: flags.adLoaded,
1860
- ad_detect: flags.adDetect,
1861
- license_key: licenseKey,
1862
- capture_at: captureAt,
1863
- timestamp: captureAt
1864
- }
1942
+ os: clientInfo.os.toLowerCase(),
1943
+ ad_loaded: (_flags_adLoaded = flags.adLoaded) !== null && _flags_adLoaded !== void 0 ? _flags_adLoaded : false,
1944
+ ad_detect: (_flags_adDetect = flags.adDetect) !== null && _flags_adDetect !== void 0 ? _flags_adDetect : false,
1945
+ capture_at: captureAt
1946
+ }, context.inputStreamType ? {
1947
+ input_stream_type: context.inputStreamType
1948
+ } : {})
1865
1949
  ];
1866
1950
  }
1867
1951
  });
1868
1952
  }).apply(this, arguments);
1869
1953
  }
1954
+ function publishTracking(licenseKey, channel, body) {
1955
+ ensureMQTTClient();
1956
+ publishMQTT(buildPlayerTopic(licenseKey, channel), body);
1957
+ }
1870
1958
  function sendInitialTracking(_0) {
1871
1959
  return _async_to_generator(function(licenseKey) {
1872
- var context, clientInfo, browserId, trackingData, error;
1960
+ var context, metricEvent, error;
1873
1961
  var _arguments = arguments;
1874
1962
  return _ts_generator(this, function(_state) {
1875
1963
  switch(_state.label){
1876
1964
  case 0:
1877
1965
  context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
1966
+ if (!canPublish(licenseKey)) return [
1967
+ 2
1968
+ ];
1878
1969
  _state.label = 1;
1879
1970
  case 1:
1880
1971
  _state.trys.push([
1881
1972
  1,
1882
- 4,
1973
+ 3,
1883
1974
  ,
1884
- 5
1975
+ 4
1885
1976
  ]);
1886
- clientInfo = getClientInfo();
1887
1977
  return [
1888
1978
  4,
1889
- getBrowserID(clientInfo)
1890
- ];
1891
- case 2:
1892
- browserId = _state.sent();
1893
- trackingData = _object_spread({
1894
- browserId: browserId
1895
- }, clientInfo);
1896
- return [
1897
- 4,
1898
- sendTrackRequest(licenseKey, {
1899
- events: [
1900
- {
1901
- player_id: browserId,
1902
- device_type: clientInfo.deviceType,
1903
- input_stream_type: context.inputStreamType,
1904
- os: clientInfo.os,
1905
- ad_loaded: false,
1906
- ad_detect: false,
1907
- license_key: licenseKey,
1908
- capture_at: /* @__PURE__ */ new Date().toISOString()
1909
- }
1910
- ],
1911
- trackingData: trackingData
1979
+ buildPlayerMetricEvent(context, {
1980
+ adLoaded: false,
1981
+ adDetect: false
1912
1982
  })
1913
1983
  ];
1914
- case 3:
1915
- _state.sent();
1984
+ case 2:
1985
+ metricEvent = _state.sent();
1986
+ publishTracking(licenseKey, "metrics", {
1987
+ events: [
1988
+ metricEvent
1989
+ ]
1990
+ });
1916
1991
  return [
1917
1992
  3,
1918
- 5
1993
+ 4
1919
1994
  ];
1920
- case 4:
1995
+ case 3:
1921
1996
  error = _state.sent();
1922
1997
  console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
1923
1998
  return [
1924
1999
  3,
1925
- 5
2000
+ 4
1926
2001
  ];
1927
- case 5:
2002
+ case 4:
1928
2003
  return [
1929
2004
  2
1930
2005
  ];
@@ -2028,53 +2103,48 @@ function sendAdImpressionTracking(_0, _1) {
2028
2103
  switch(_state.label){
2029
2104
  case 0:
2030
2105
  context = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
2106
+ if (!canPublish(licenseKey)) return [
2107
+ 2
2108
+ ];
2031
2109
  _state.label = 1;
2032
2110
  case 1:
2033
2111
  _state.trys.push([
2034
2112
  1,
2035
- 4,
2113
+ 3,
2036
2114
  ,
2037
- 5
2115
+ 4
2038
2116
  ]);
2039
2117
  return [
2040
2118
  4,
2041
- buildPlayerMetricEvent(licenseKey, context, {
2119
+ buildPlayerMetricEvent(context, {
2042
2120
  captureAt: adImpressionInfo.timestamp
2043
2121
  })
2044
2122
  ];
2045
2123
  case 2:
2046
2124
  metricEvent = _state.sent();
2047
- return [
2048
- 4,
2049
- Promise.all([
2050
- postJson(HEARTBEAT_URL, licenseKey, metricEvent),
2051
- postJson(IMPRESSIONS_URL, licenseKey, {
2052
- events: [
2053
- {
2054
- player_id: metricEvent.player_id,
2055
- ad_played_count: 1,
2056
- ad_url: adImpressionInfo.adUrl,
2057
- license_key: licenseKey,
2058
- capture_at: adImpressionInfo.timestamp
2059
- }
2060
- ]
2061
- })
2062
- ])
2063
- ];
2064
- case 3:
2065
- _state.sent();
2125
+ publishTracking(licenseKey, "heartbeat", metricEvent);
2126
+ publishTracking(licenseKey, "impressions", {
2127
+ events: [
2128
+ {
2129
+ player_id: metricEvent.player_id,
2130
+ ad_played_count: 1,
2131
+ ad_url: adImpressionInfo.adUrl,
2132
+ capture_at: adImpressionInfo.timestamp
2133
+ }
2134
+ ]
2135
+ });
2066
2136
  return [
2067
2137
  3,
2068
- 5
2138
+ 4
2069
2139
  ];
2070
- case 4:
2140
+ case 3:
2071
2141
  error = _state.sent();
2072
2142
  console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
2073
2143
  return [
2074
2144
  3,
2075
- 5
2145
+ 4
2076
2146
  ];
2077
- case 5:
2147
+ case 4:
2078
2148
  return [
2079
2149
  2
2080
2150
  ];
@@ -2090,38 +2160,36 @@ function sendHeartbeat(_0) {
2090
2160
  switch(_state.label){
2091
2161
  case 0:
2092
2162
  context = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {}, flags = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : {};
2163
+ if (!canPublish(licenseKey)) return [
2164
+ 2
2165
+ ];
2093
2166
  _state.label = 1;
2094
2167
  case 1:
2095
2168
  _state.trys.push([
2096
2169
  1,
2097
- 4,
2170
+ 3,
2098
2171
  ,
2099
- 5
2172
+ 4
2100
2173
  ]);
2101
2174
  return [
2102
2175
  4,
2103
- buildPlayerMetricEvent(licenseKey, context, flags)
2176
+ buildPlayerMetricEvent(context, flags)
2104
2177
  ];
2105
2178
  case 2:
2106
2179
  heartbeatData = _state.sent();
2107
- return [
2108
- 4,
2109
- postJson(HEARTBEAT_URL, licenseKey, heartbeatData)
2110
- ];
2111
- case 3:
2112
- _state.sent();
2180
+ publishTracking(licenseKey, "heartbeat", heartbeatData);
2113
2181
  return [
2114
2182
  3,
2115
- 5
2183
+ 4
2116
2184
  ];
2117
- case 4:
2185
+ case 3:
2118
2186
  error = _state.sent();
2119
2187
  console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
2120
2188
  return [
2121
2189
  3,
2122
- 5
2190
+ 4
2123
2191
  ];
2124
- case 5:
2192
+ case 4:
2125
2193
  return [
2126
2194
  2
2127
2195
  ];
@@ -2380,6 +2448,166 @@ function initializePolyfills() {
2380
2448
  polyfillTextEncoder();
2381
2449
  polyfillPromiseFinally();
2382
2450
  }
2451
+ // src/utils/vastMacros.ts
2452
+ function generateCorrelator() {
2453
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
2454
+ try {
2455
+ var _buf_, _buf_1;
2456
+ var buf = new Uint32Array(2);
2457
+ crypto.getRandomValues(buf);
2458
+ 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);
2459
+ if (value > 0) {
2460
+ return String(value);
2461
+ }
2462
+ } catch (unused) {}
2463
+ }
2464
+ return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
2465
+ }
2466
+ var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
2467
+ function applyVastMacros(baseUrl, ctx) {
2468
+ var url;
2469
+ try {
2470
+ url = new URL(baseUrl);
2471
+ } catch (unused) {
2472
+ return replaceCorrelatorFallback(baseUrl, ctx.correlator);
2473
+ }
2474
+ var params = url.searchParams;
2475
+ params.set("correlator", ctx.correlator);
2476
+ params.set("scor", ctx.streamCorrelator);
2477
+ if (ctx.pod != null) {
2478
+ params.set("pod", String(ctx.pod));
2479
+ }
2480
+ if (ctx.adPosition != null) {
2481
+ params.set("ppos", String(ctx.adPosition));
2482
+ }
2483
+ if (ctx.pageUrl) {
2484
+ params.set("url", ctx.pageUrl);
2485
+ params.set("description_url", ctx.pageUrl);
2486
+ }
2487
+ if (ctx.adWillPlayMuted != null) {
2488
+ params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
2489
+ }
2490
+ if (ctx.adWillAutoPlay != null) {
2491
+ params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
2492
+ }
2493
+ if (ctx.deviceId && ctx.deviceIdType) {
2494
+ params.set("rdid", ctx.deviceId);
2495
+ params.set("idtype", ctx.deviceIdType);
2496
+ params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
2497
+ } else {
2498
+ params.delete("rdid");
2499
+ params.delete("idtype");
2500
+ params.delete("is_lat");
2501
+ }
2502
+ var consent = ctx.consent;
2503
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
2504
+ params.set("gdpr", consent.gdpr);
2505
+ }
2506
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
2507
+ params.set("gdpr_consent", consent.gdprConsent);
2508
+ }
2509
+ if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
2510
+ params.set("us_privacy", consent.usPrivacy);
2511
+ }
2512
+ if (ctx.adTest) {
2513
+ params.set("adtest", "on");
2514
+ }
2515
+ var staleKeys = [];
2516
+ params.forEach(function(value, key) {
2517
+ if (UNEXPANDED_MACRO_PATTERN.test(value)) {
2518
+ staleKeys.push(key);
2519
+ }
2520
+ });
2521
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
2522
+ try {
2523
+ for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
2524
+ var key = _step.value;
2525
+ params.delete(key);
2526
+ }
2527
+ } catch (err) {
2528
+ _didIteratorError = true;
2529
+ _iteratorError = err;
2530
+ } finally{
2531
+ try {
2532
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
2533
+ _iterator.return();
2534
+ }
2535
+ } finally{
2536
+ if (_didIteratorError) {
2537
+ throw _iteratorError;
2538
+ }
2539
+ }
2540
+ }
2541
+ return url.toString();
2542
+ }
2543
+ function replaceCorrelatorFallback(baseUrl, correlator) {
2544
+ var correlatorRegex = /([?&])correlator=([^&]*)/;
2545
+ if (correlatorRegex.test(baseUrl)) {
2546
+ return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
2547
+ }
2548
+ var sep = baseUrl.includes("?") ? "&" : "?";
2549
+ return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
2550
+ }
2551
+ function fetchConsentSignals() {
2552
+ var timeoutMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1500;
2553
+ var signals = {};
2554
+ if (typeof window === "undefined") {
2555
+ return Promise.resolve(signals);
2556
+ }
2557
+ var tasks = [];
2558
+ var tcfApi = window.__tcfapi;
2559
+ if (typeof tcfApi === "function") {
2560
+ tasks.push(new Promise(function(resolve) {
2561
+ var settled = false;
2562
+ try {
2563
+ tcfApi("addEventListener", 2, function(tcData, success) {
2564
+ if (settled) return;
2565
+ if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
2566
+ settled = true;
2567
+ signals.gdpr = tcData.gdprApplies ? "1" : "0";
2568
+ if (typeof tcData.tcString === "string" && tcData.tcString) {
2569
+ signals.gdprConsent = tcData.tcString;
2570
+ }
2571
+ try {
2572
+ tcfApi("removeEventListener", 2, function() {}, tcData.listenerId);
2573
+ } catch (unused) {}
2574
+ resolve();
2575
+ }
2576
+ });
2577
+ } catch (unused) {
2578
+ resolve();
2579
+ }
2580
+ setTimeout(function() {
2581
+ if (!settled) {
2582
+ settled = true;
2583
+ resolve();
2584
+ }
2585
+ }, timeoutMs);
2586
+ }));
2587
+ }
2588
+ var uspApi = window.__uspapi;
2589
+ if (typeof uspApi === "function") {
2590
+ tasks.push(new Promise(function(resolve) {
2591
+ try {
2592
+ uspApi("getUSPData", 1, function(data, success) {
2593
+ if (success && typeof (data === null || data === void 0 ? void 0 : data.uspString) === "string" && data.uspString) {
2594
+ signals.usPrivacy = data.uspString;
2595
+ }
2596
+ resolve();
2597
+ });
2598
+ } catch (unused) {
2599
+ resolve();
2600
+ }
2601
+ setTimeout(resolve, timeoutMs);
2602
+ }));
2603
+ }
2604
+ if (tasks.length === 0) {
2605
+ return Promise.resolve(signals);
2606
+ }
2607
+ return Promise.all(tasks).then(function() {
2608
+ return signals;
2609
+ });
2610
+ }
2383
2611
  // src/utils/browserCompat.ts
2384
2612
  function getChromeVersion(ua) {
2385
2613
  var match = ua.match(/Chrome\/(\d+)/);
@@ -2628,6 +2856,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2628
2856
  this.preloadPoolLoopRunning = false;
2629
2857
  this.adDetectSentForCurrentBreak = false;
2630
2858
  this.palPlaybackStarted = false;
2859
+ this.streamCorrelator = generateCorrelator();
2860
+ this.consentSignals = {};
2861
+ this.podCounter = 0;
2862
+ this.podAssignedByPrefetch = false;
2863
+ this.adRequestPositionInBreak = 0;
2631
2864
  this.continuousFetchLoopRunning = false;
2632
2865
  initializePolyfills();
2633
2866
  var browserOverrides = getBrowserConfigOverrides();
@@ -2700,6 +2933,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2700
2933
  adWillPlayMuted: !!this.config.muted,
2701
2934
  continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
2702
2935
  }).catch(function() {});
2936
+ fetchConsentSignals().then(function(signals) {
2937
+ _this.consentSignals = signals;
2938
+ }).catch(function() {});
2703
2939
  this.initializeTracking();
2704
2940
  if (!this.shouldUseNativeHls()) return [
2705
2941
  3,
@@ -2767,7 +3003,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
2767
3003
  var _level_details, _level_details1;
2768
3004
  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";
2769
3005
  })) !== null && _ref !== void 0 ? _ref : false;
2770
- if (!this.isLiveStream && this.vmapBreaks.length === 0 && this.apiVastTagUrl) {
3006
+ if (!this.isVmapEnabled() && !this.isLiveStream && this.vmapBreaks.length === 0 && this.apiVastTagUrl) {
2771
3007
  prerollKey = "synthetic-vod-preroll";
2772
3008
  if (!this.consumedVmapBreakIds.has(prerollKey)) {
2773
3009
  this.vmapBreaks = [
@@ -3352,12 +3588,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
3352
3588
  _this.palNonce.sendPlaybackStart();
3353
3589
  }
3354
3590
  });
3355
- this.video.addEventListener("ended", function() {
3591
+ this.endedHandler = function() {
3356
3592
  if (_this.palPlaybackStarted) {
3357
3593
  _this.palPlaybackStarted = false;
3358
3594
  _this.palNonce.sendPlaybackEnd();
3359
3595
  }
3360
- });
3596
+ _this.onVideoEnded();
3597
+ };
3598
+ this.video.addEventListener("ended", this.endedHandler);
3361
3599
  this.video.addEventListener("mousedown", function(e) {
3362
3600
  _this.palNonce.sendAdTouch(e);
3363
3601
  });
@@ -4679,6 +4917,13 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4679
4917
  }
4680
4918
  }
4681
4919
  },
4920
+ {
4921
+ key: "isVmapEnabled",
4922
+ value: function isVmapEnabled() {
4923
+ var _this_config_vmapUrl;
4924
+ return !!(this.config.isVmap && ((_this_config_vmapUrl = this.config.vmapUrl) === null || _this_config_vmapUrl === void 0 ? void 0 : _this_config_vmapUrl.trim()));
4925
+ }
4926
+ },
4682
4927
  {
4683
4928
  key: "fetchAdConfiguration",
4684
4929
  value: function fetchAdConfiguration() {
@@ -4687,7 +4932,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4687
4932
  return _ts_generator(this, function(_state) {
4688
4933
  switch(_state.label){
4689
4934
  case 0:
4690
- if (!this.config.vmapUrl) return [
4935
+ if (!this.isVmapEnabled()) return [
4691
4936
  3,
4692
4937
  2
4693
4938
  ];
@@ -4697,7 +4942,12 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4697
4942
  ];
4698
4943
  case 1:
4699
4944
  _state.sent();
4700
- _state.label = 2;
4945
+ if (this.config.debugAdTiming) {
4946
+ console.log("[StormcloudVideoPlayer] VMAP mode enabled");
4947
+ }
4948
+ return [
4949
+ 2
4950
+ ];
4701
4951
  case 2:
4702
4952
  vastMode = this.config.vastMode || "default";
4703
4953
  if (this.config.debugAdTiming) {
@@ -4865,7 +5115,16 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4865
5115
  }
4866
5116
  return [];
4867
5117
  }
4868
- var adBreakNodes = Array.from(doc.querySelectorAll("AdBreak, vmap\\:AdBreak"));
5118
+ var VMAP_NS = "http://www.iab.net/videosuite/vmap";
5119
+ var adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, "AdBreak"));
5120
+ if (adBreakNodes.length === 0) {
5121
+ adBreakNodes = Array.from(doc.querySelectorAll("AdBreak, vmap\\:AdBreak"));
5122
+ }
5123
+ if (adBreakNodes.length === 0) {
5124
+ adBreakNodes = Array.from(doc.getElementsByTagName("*")).filter(function(el) {
5125
+ return el.localName === "AdBreak";
5126
+ });
5127
+ }
4869
5128
  var parsed = [];
4870
5129
  adBreakNodes.forEach(function(node, index) {
4871
5130
  var timeOffsetRaw = (node.getAttribute("timeOffset") || "").trim();
@@ -4873,7 +5132,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4873
5132
  if (startTimeMs == null) {
4874
5133
  return;
4875
5134
  }
4876
- var adTagNode = node.querySelector("AdTagURI, vmap\\:AdTagURI");
5135
+ var adTagNode = node.getElementsByTagNameNS(VMAP_NS, "AdTagURI")[0];
5136
+ if (!adTagNode) {
5137
+ var _node_querySelector;
5138
+ adTagNode = (_node_querySelector = node.querySelector("AdTagURI, vmap\\:AdTagURI")) !== null && _node_querySelector !== void 0 ? _node_querySelector : void 0;
5139
+ }
4877
5140
  var adTagUrl = ((adTagNode === null || adTagNode === void 0 ? void 0 : adTagNode.textContent) || "").trim();
4878
5141
  if (!adTagUrl) {
4879
5142
  return;
@@ -4969,25 +5232,35 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
4969
5232
  return this.getRemainingAdMs();
4970
5233
  }
4971
5234
  },
5235
+ {
5236
+ key: "beginNewAdPod",
5237
+ value: function beginNewAdPod() {
5238
+ this.podCounter++;
5239
+ this.adRequestPositionInBreak = 0;
5240
+ }
5241
+ },
4972
5242
  {
4973
5243
  key: "generateVastUrlsWithCorrelators",
4974
5244
  value: function generateVastUrlsWithCorrelators(baseUrl, count) {
4975
5245
  var urls = [];
4976
- var baseTimestamp = Date.now();
4977
5246
  for(var i = 0; i < count; i++){
4978
- var timestamp = baseTimestamp + i;
4979
- var random = Math.floor(Math.random() * 1e12);
4980
- var uniqueCorrelator = "".concat(timestamp, "_").concat(random, "_").concat(i);
4981
- var urlWithCorrelator = void 0;
4982
- var correlatorRegex = /([?&])correlator=([^&]*)/;
4983
- if (correlatorRegex.test(baseUrl)) {
4984
- urlWithCorrelator = baseUrl.replace(correlatorRegex, "$1correlator=".concat(uniqueCorrelator));
4985
- } else if (baseUrl.includes("?")) {
4986
- urlWithCorrelator = "".concat(baseUrl, "&correlator=").concat(uniqueCorrelator);
4987
- } else {
4988
- urlWithCorrelator = "".concat(baseUrl, "?correlator=").concat(uniqueCorrelator);
4989
- }
4990
- urls.push(this.palNonce.injectNonce(urlWithCorrelator));
5247
+ this.adRequestPositionInBreak++;
5248
+ var adWillPlayMuted = this.inAdBreak ? this.adPlayer.getOriginalMutedState() : this.video.muted;
5249
+ var urlWithMacros = applyVastMacros(baseUrl, {
5250
+ correlator: generateCorrelator(),
5251
+ streamCorrelator: this.streamCorrelator,
5252
+ pod: this.podCounter > 0 ? this.podCounter : void 0,
5253
+ adPosition: this.adRequestPositionInBreak,
5254
+ pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
5255
+ adWillPlayMuted: adWillPlayMuted,
5256
+ adWillAutoPlay: !!this.config.autoplay,
5257
+ deviceId: this.config.deviceId,
5258
+ deviceIdType: this.config.deviceIdType,
5259
+ limitAdTracking: this.config.limitAdTracking,
5260
+ adTest: this.config.adTest,
5261
+ consent: this.consentSignals
5262
+ });
5263
+ urls.push(this.palNonce.injectNonce(urlWithMacros));
4991
5264
  }
4992
5265
  return urls;
4993
5266
  }
@@ -5057,6 +5330,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5057
5330
  }
5058
5331
  return;
5059
5332
  }
5333
+ this.beginNewAdPod();
5334
+ this.podAssignedByPrefetch = true;
5060
5335
  var urlsToPregenerate = 5;
5061
5336
  var generatedUrls = this.generateVastUrlsWithCorrelators(baseVastUrl, urlsToPregenerate);
5062
5337
  this.pendingAdBreak = _object_spread_props(_object_spread({
@@ -5094,6 +5369,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5094
5369
  }
5095
5370
  this.pendingAdBreak = null;
5096
5371
  this.pendingScte35CueKey = void 0;
5372
+ this.podAssignedByPrefetch = false;
5097
5373
  }
5098
5374
  },
5099
5375
  {
@@ -5530,6 +5806,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
5530
5806
  this.continuousFetchingActive = true;
5531
5807
  this.isShowingPlaceholder = false;
5532
5808
  this.totalAdRequestsInBreak = 0;
5809
+ if (this.podAssignedByPrefetch) {
5810
+ this.podAssignedByPrefetch = false;
5811
+ } else {
5812
+ this.beginNewAdPod();
5813
+ }
5533
5814
  currentMuted = this.video.muted;
5534
5815
  currentVolume = this.video.volume;
5535
5816
  this.adPlayer.updateOriginalMutedState(currentMuted, currentVolume);
@@ -6430,23 +6711,49 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
6430
6711
  key: "onTimeUpdate",
6431
6712
  value: function onTimeUpdate(currentTimeSec) {
6432
6713
  var _this = this;
6714
+ if (!this.isVmapEnabled() || this.vmapBreaks.length === 0) {
6715
+ return;
6716
+ }
6433
6717
  if (this.adPlayer.isAdPlaying() || this.inAdBreak) return;
6434
6718
  var nowMs = currentTimeSec * 1e3;
6435
6719
  var breakToPlay = this.findBreakForTime(nowMs);
6436
6720
  if (breakToPlay) {
6437
- void this.handleMidAdJoin(breakToPlay, nowMs).catch(function(error) {
6721
+ void this.handleVmapAdBreak(breakToPlay, nowMs).catch(function(error) {
6722
+ if (_this.config.debugAdTiming) {
6723
+ console.warn("[StormcloudVideoPlayer] VMAP ad break failed gracefully:", error);
6724
+ }
6725
+ });
6726
+ }
6727
+ }
6728
+ },
6729
+ {
6730
+ key: "onVideoEnded",
6731
+ value: function onVideoEnded() {
6732
+ var _this = this;
6733
+ if (!this.isVmapEnabled() || this.vmapBreaks.length === 0) {
6734
+ return;
6735
+ }
6736
+ if (this.adPlayer.isAdPlaying() || this.inAdBreak) {
6737
+ return;
6738
+ }
6739
+ var durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;
6740
+ var postroll = this.vmapBreaks.find(function(b) {
6741
+ return b.startTimeMs === -1 && !_this.consumedVmapBreakIds.has(_this.getAdBreakKey(b));
6742
+ });
6743
+ if (postroll) {
6744
+ void this.handleVmapAdBreak(postroll, durationMs).catch(function(error) {
6438
6745
  if (_this.config.debugAdTiming) {
6439
- console.warn("[StormcloudVideoPlayer] Mid-roll VMAP join failed gracefully:", error);
6746
+ console.warn("[StormcloudVideoPlayer] VMAP post-roll failed gracefully:", error);
6440
6747
  }
6441
6748
  });
6442
6749
  }
6443
6750
  }
6444
6751
  },
6445
6752
  {
6446
- key: "handleMidAdJoin",
6447
- value: function handleMidAdJoin(adBreak, nowMs) {
6753
+ key: "handleVmapAdBreak",
6754
+ value: function handleVmapAdBreak(adBreak, nowMs) {
6448
6755
  return _async_to_generator(function() {
6449
- var _adBreak_durationMs, _this_config_driftToleranceMs, key, breakStartMs, durationMs, endMs, tol, inWindow, remainingMs, tags, first, rest, error;
6756
+ var _adBreak_durationMs, key, breakStartMs, durationMs, endMs, inWindow, tags, first, rest, error;
6450
6757
  return _ts_generator(this, function(_state) {
6451
6758
  switch(_state.label){
6452
6759
  case 0:
@@ -6464,25 +6771,28 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
6464
6771
  }
6465
6772
  durationMs = (_adBreak_durationMs = adBreak.durationMs) !== null && _adBreak_durationMs !== void 0 ? _adBreak_durationMs : 0;
6466
6773
  endMs = breakStartMs + durationMs;
6467
- tol = (_this_config_driftToleranceMs = this.config.driftToleranceMs) !== null && _this_config_driftToleranceMs !== void 0 ? _this_config_driftToleranceMs : 1e3;
6468
- inWindow = durationMs > 0 ? nowMs > breakStartMs && nowMs < endMs : nowMs + tol >= breakStartMs;
6774
+ inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;
6469
6775
  if (!inWindow) return [
6470
6776
  3,
6471
6777
  4
6472
6778
  ];
6473
6779
  this.consumedVmapBreakIds.add(key);
6474
- remainingMs = durationMs > 0 ? Math.max(0, endMs - nowMs) : 0;
6475
- tags = this.selectVastTagsForBreak(adBreak) || (this.apiVastTagUrl ? [
6476
- this.apiVastTagUrl
6477
- ] : void 0);
6478
- if (!(tags && tags.length > 0)) return [
6479
- 3,
6480
- 4
6481
- ];
6780
+ tags = this.selectVastTagsForBreak(adBreak);
6781
+ if (!tags || tags.length === 0) {
6782
+ return [
6783
+ 2
6784
+ ];
6785
+ }
6482
6786
  first = tags[0];
6483
6787
  rest = tags.slice(1);
6484
6788
  this.adPodQueue = rest;
6485
6789
  this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);
6790
+ this.showAds = true;
6791
+ this.inAdBreak = true;
6792
+ this.currentAdBreakStartWallClockMs = Date.now();
6793
+ if (!this.video.paused) {
6794
+ this.video.pause();
6795
+ }
6486
6796
  _state.label = 1;
6487
6797
  case 1:
6488
6798
  _state.trys.push([
@@ -6497,10 +6807,6 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
6497
6807
  ];
6498
6808
  case 2:
6499
6809
  _state.sent();
6500
- this.inAdBreak = true;
6501
- this.expectedAdBreakDurationMs = remainingMs;
6502
- this.currentAdBreakStartWallClockMs = Date.now();
6503
- this.scheduleAdStopCountdown(remainingMs);
6504
6810
  return [
6505
6811
  3,
6506
6812
  4
@@ -6508,8 +6814,10 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
6508
6814
  case 3:
6509
6815
  error = _state.sent();
6510
6816
  this.adPodQueue = [];
6817
+ this.inAdBreak = false;
6818
+ this.showAds = false;
6511
6819
  if (this.config.debugAdTiming) {
6512
- console.warn("[StormcloudVideoPlayer] Mid-roll VMAP ad request failed:", error);
6820
+ console.warn("[StormcloudVideoPlayer] VMAP ad request failed:", error);
6513
6821
  }
6514
6822
  return [
6515
6823
  3,
@@ -7221,9 +7529,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
7221
7529
  {
7222
7530
  key: "findBreakForTime",
7223
7531
  value: function findBreakForTime(nowMs) {
7224
- var _this_config_driftToleranceMs;
7225
7532
  var schedule = this.vmapBreaks;
7226
- var tol = (_this_config_driftToleranceMs = this.config.driftToleranceMs) !== null && _this_config_driftToleranceMs !== void 0 ? _this_config_driftToleranceMs : 1e3;
7227
7533
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7228
7534
  try {
7229
7535
  for(var _iterator = schedule[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
@@ -7235,9 +7541,14 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
7235
7541
  if (breakStartMs == null) {
7236
7542
  continue;
7237
7543
  }
7238
- var end = breakStartMs + (b.durationMs || 0);
7239
- var effectiveTol = breakStartMs === 0 ? Math.max(tol, 3e4) : tol;
7240
- if (nowMs >= breakStartMs && (b.durationMs ? nowMs < end : nowMs <= breakStartMs + effectiveTol)) {
7544
+ if (b.durationMs) {
7545
+ var end = breakStartMs + b.durationMs;
7546
+ if (nowMs >= breakStartMs && nowMs < end) {
7547
+ return b;
7548
+ }
7549
+ continue;
7550
+ }
7551
+ if (nowMs >= breakStartMs) {
7241
7552
  return b;
7242
7553
  }
7243
7554
  }
@@ -7445,6 +7756,10 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
7445
7756
  this.video.removeEventListener("timeupdate", this.timeUpdateHandler);
7446
7757
  delete this.timeUpdateHandler;
7447
7758
  }
7759
+ if (this.endedHandler) {
7760
+ this.video.removeEventListener("ended", this.endedHandler);
7761
+ delete this.endedHandler;
7762
+ }
7448
7763
  if (this.emptiedHandler) {
7449
7764
  this.video.removeEventListener("emptied", this.emptiedHandler);
7450
7765
  delete this.emptiedHandler;
@@ -7475,6 +7790,7 @@ var CRITICAL_PROPS = [
7475
7790
  "allowNativeHls",
7476
7791
  "isLiveStream",
7477
7792
  "licenseKey",
7793
+ "isVmap",
7478
7794
  "vmapUrl",
7479
7795
  "lowLatencyMode",
7480
7796
  "driftToleranceMs",
@@ -7483,7 +7799,7 @@ var CRITICAL_PROPS = [
7483
7799
  var CONTROLS_HIDE_DELAY = 3e3;
7484
7800
  var DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;
7485
7801
  var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7486
- 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, [
7802
+ 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, [
7487
7803
  "src",
7488
7804
  "autoplay",
7489
7805
  "muted",
@@ -7511,6 +7827,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7511
7827
  "licenseKey",
7512
7828
  "vastMode",
7513
7829
  "vastTagUrl",
7830
+ "isVmap",
7514
7831
  "vmapUrl",
7515
7832
  "minSegmentsBeforePlay"
7516
7833
  ]);
@@ -7653,6 +7970,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7653
7970
  allowNativeHls,
7654
7971
  isLiveStream,
7655
7972
  licenseKey,
7973
+ isVmap,
7656
7974
  vmapUrl,
7657
7975
  lowLatencyMode,
7658
7976
  driftToleranceMs,
@@ -7697,6 +8015,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
7697
8015
  if (licenseKey !== void 0) cfg.licenseKey = licenseKey;
7698
8016
  if (vastMode !== void 0) cfg.vastMode = vastMode;
7699
8017
  if (vastTagUrl !== void 0) cfg.vastTagUrl = vastTagUrl;
8018
+ if (isVmap !== void 0) cfg.isVmap = isVmap;
7700
8019
  if (vmapUrl !== void 0) cfg.vmapUrl = vmapUrl;
7701
8020
  if (minSegmentsBeforePlay !== void 0) cfg.minSegmentsBeforePlay = minSegmentsBeforePlay;
7702
8021
  var player = new StormcloudVideoPlayer(cfg);
@@ -8859,6 +9178,7 @@ var defaultProps = {
8859
9178
  showCustomControls: false,
8860
9179
  hideLoadingIndicator: false,
8861
9180
  licenseKey: "",
9181
+ isVmap: false,
8862
9182
  vmapUrl: "",
8863
9183
  adFailsafeTimeoutMs: 1e4,
8864
9184
  minSegmentsBeforePlay: 2,
@@ -9803,6 +10123,7 @@ var SUPPORTED_PROPS = [
9803
10123
  "debugAdTiming",
9804
10124
  "showCustomControls",
9805
10125
  "licenseKey",
10126
+ "isVmap",
9806
10127
  "vmapUrl",
9807
10128
  "adFailsafeTimeoutMs",
9808
10129
  "minSegmentsBeforePlay",
@@ -9992,31 +10313,46 @@ var StormcloudPlayer = createStormcloudPlayer(players_default, players_default[p
9992
10313
  var StormcloudPlayer_default = StormcloudPlayer;
9993
10314
  // Annotate the CommonJS export names for ESM import in node:
9994
10315
  0 && (module.exports = {
10316
+ DEFAULT_MQTT_CONFIG: DEFAULT_MQTT_CONFIG,
9995
10317
  IS_BROWSER: IS_BROWSER,
9996
10318
  IS_GLOBAL: IS_GLOBAL,
9997
10319
  IS_IOS: IS_IOS,
9998
10320
  IS_SAFARI: IS_SAFARI,
10321
+ MQTT_CA_CERT_FILE: MQTT_CA_CERT_FILE,
9999
10322
  SUPPORTS_DASH: SUPPORTS_DASH,
10000
10323
  SUPPORTS_HLS: SUPPORTS_HLS,
10001
10324
  StormcloudPlayer: StormcloudPlayer,
10002
10325
  StormcloudVideoPlayer: StormcloudVideoPlayer,
10003
10326
  StormcloudVideoPlayerComponent: StormcloudVideoPlayerComponent,
10327
+ applyMQTTConfig: applyMQTTConfig,
10328
+ buildMQTTBrokerUrl: buildMQTTBrokerUrl,
10329
+ buildPlayerTopic: buildPlayerTopic,
10004
10330
  canPlay: canPlay,
10331
+ configureMQTT: configureMQTT,
10005
10332
  createHlsAdPlayer: createHlsAdPlayer,
10006
10333
  createPalNonceManager: createPalNonceManager,
10007
10334
  createStormcloudPlayer: createStormcloudPlayer,
10008
10335
  detectBrowser: detectBrowser,
10336
+ disconnectMQTT: disconnectMQTT,
10337
+ ensureMQTTClient: ensureMQTTClient,
10009
10338
  getBrowserConfigOverrides: getBrowserConfigOverrides,
10010
10339
  getBrowserID: getBrowserID,
10011
10340
  getClientInfo: getClientInfo,
10341
+ getMQTTStatus: getMQTTStatus,
10342
+ initMQTTClient: initMQTTClient,
10012
10343
  initializePolyfills: initializePolyfills,
10344
+ isMQTTConfigured: isMQTTConfigured,
10345
+ isMQTTConnected: isMQTTConnected,
10346
+ isMQTTEnabled: isMQTTEnabled,
10013
10347
  isMediaStream: isMediaStream,
10014
10348
  lazy: lazy,
10015
10349
  logBrowserInfo: logBrowserInfo,
10016
10350
  merge: merge,
10351
+ mqttConfig: mqttConfig,
10017
10352
  omit: omit,
10018
10353
  parseQuery: parseQuery,
10019
10354
  players: players,
10355
+ publishMQTT: publishMQTT,
10020
10356
  randomString: randomString,
10021
10357
  sendAdDetectTracking: sendAdDetectTracking,
10022
10358
  sendAdImpressionTracking: sendAdImpressionTracking,