stormcloud-video-player 0.8.24 → 0.8.26

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.
Files changed (44) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/index.cjs +669 -126
  3. package/lib/index.cjs.map +1 -1
  4. package/lib/index.d.cts +10 -1
  5. package/lib/index.d.ts +10 -1
  6. package/lib/index.js +666 -127
  7. package/lib/index.js.map +1 -1
  8. package/lib/player/AdBreakOrchestrator.cjs +228 -48
  9. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  10. package/lib/player/AdBreakOrchestrator.d.cts +5 -1
  11. package/lib/player/AdConfigManager.cjs +81 -4
  12. package/lib/player/AdConfigManager.cjs.map +1 -1
  13. package/lib/player/AdConfigManager.d.cts +12 -1
  14. package/lib/player/AdPreloadPool.d.cts +1 -1
  15. package/lib/player/AdTimingService.cjs +7 -0
  16. package/lib/player/AdTimingService.cjs.map +1 -1
  17. package/lib/player/AdTimingService.d.cts +2 -1
  18. package/lib/player/HlsEngine.d.cts +1 -1
  19. package/lib/player/PlayerControls.d.cts +1 -1
  20. package/lib/player/Scte35CueManager.d.cts +1 -1
  21. package/lib/player/Scte35Parser.d.cts +1 -1
  22. package/lib/player/StormcloudVideoPlayer.cjs +665 -126
  23. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  24. package/lib/player/StormcloudVideoPlayer.d.cts +2 -1
  25. package/lib/player/playerTypes.d.cts +1 -1
  26. package/lib/players/HlsPlayer.cjs +665 -126
  27. package/lib/players/HlsPlayer.cjs.map +1 -1
  28. package/lib/players/HlsPlayer.d.cts +1 -1
  29. package/lib/players/index.cjs +665 -126
  30. package/lib/players/index.cjs.map +1 -1
  31. package/lib/sdk/hlsAdPlayer.cjs +343 -71
  32. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  33. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  34. package/lib/{types-DNiBmPKK.d.cts → types-Xgz2_W1C.d.cts} +7 -0
  35. package/lib/ui/StormcloudVideoPlayer.cjs +665 -126
  36. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  37. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  38. package/lib/utils/tracking.cjs +22 -1
  39. package/lib/utils/tracking.cjs.map +1 -1
  40. package/lib/utils/tracking.d.cts +3 -2
  41. package/lib/utils/vastMacros.cjs +14 -1
  42. package/lib/utils/vastMacros.cjs.map +1 -1
  43. package/lib/utils/vastMacros.d.cts +3 -0
  44. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { S as Scte35Marker, a as StormcloudVideoPlayerConfig, A as AdController } from '../types-DNiBmPKK.cjs';
1
+ import { S as Scte35Marker, a as StormcloudVideoPlayerConfig, A as AdController } from '../types-Xgz2_W1C.cjs';
2
2
  import { AdTimingService } from './AdTimingService.cjs';
3
3
  import { AdPreloadPool } from './AdPreloadPool.cjs';
4
4
  import { AdConfigManager } from './AdConfigManager.cjs';
@@ -17,6 +17,7 @@ interface AdBreakOrchestratorHost {
17
17
  shouldContinueLiveStreamDuringAds(): boolean;
18
18
  getLiveSyncPosition(): number | undefined;
19
19
  generateVastUrls(baseUrl: string, count: number): string[];
20
+ generatePodVastUrl(baseUrl: string, breakDurationMs?: number): string;
20
21
  }
21
22
  declare class AdBreakOrchestrator {
22
23
  inAdBreak: boolean;
@@ -44,10 +45,13 @@ declare class AdBreakOrchestrator {
44
45
  private readonly placeholder;
45
46
  constructor(host: AdBreakOrchestratorHost, timing: AdTimingService, preloadPool: AdPreloadPool, adConfig: AdConfigManager, cueManager: Scte35CueManager, placeholder: PlaceholderLayer);
46
47
  private get debug();
48
+ private get analyticsContext();
49
+ private get optimizedPodsEnabled();
47
50
  attachImaEventListeners(): void;
48
51
  recreateAdController(): void;
49
52
  clearPendingAdBreak(): void;
50
53
  handleAdStart(_marker: Scte35Marker): Promise<void>;
54
+ private startOptimizedPod;
51
55
  private swapToPreloadedAdPlayer;
52
56
  private startContinuousFetching;
53
57
  private continuousFetchLoop;
@@ -1085,7 +1085,20 @@ function applyVastMacros(baseUrl, ctx) {
1085
1085
  if (ctx.pod != null) {
1086
1086
  params.set("pod", String(ctx.pod));
1087
1087
  }
1088
- if (ctx.adPosition != null) {
1088
+ var optimizedPodMode = ctx.podMaxAds != null || ctx.podMinDurationMs != null || ctx.podMaxDurationMs != null;
1089
+ if (optimizedPodMode) {
1090
+ params.delete("ppos");
1091
+ params.delete("lip");
1092
+ if (ctx.podMinDurationMs != null) {
1093
+ params.set("pmnd", String(Math.max(0, Math.round(ctx.podMinDurationMs))));
1094
+ }
1095
+ if (ctx.podMaxDurationMs != null) {
1096
+ params.set("pmxd", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));
1097
+ }
1098
+ if (ctx.podMaxAds != null) {
1099
+ params.set("pmad", String(Math.max(1, Math.round(ctx.podMaxAds))));
1100
+ }
1101
+ } else if (ctx.adPosition != null) {
1089
1102
  params.set("ppos", String(ctx.adPosition));
1090
1103
  }
1091
1104
  var requestUrl = ctx.contentUrl || ctx.pageUrl;
@@ -1270,6 +1283,16 @@ function publishMQTT(topic, payload) {
1270
1283
  }
1271
1284
  // src/utils/tracking.ts
1272
1285
  var cachedBrowserId = null;
1286
+ function buildAnalyticsContext(config) {
1287
+ var context = {};
1288
+ if (config.debugAdTiming) {
1289
+ context.debugAdTiming = true;
1290
+ }
1291
+ if (config.isLiveStream !== void 0) {
1292
+ context.inputStreamType = config.isLiveStream ? "live" : "vod";
1293
+ }
1294
+ return context;
1295
+ }
1273
1296
  function getClientInfo() {
1274
1297
  var _screen, _screen1, _screen2, _screen3, _screen_orientation, _screen4, _screen5, _window, _window1, _window_screen_orientation, _window_screen, _navigator_languages;
1275
1298
  var ua = navigator.userAgent;
@@ -1528,19 +1551,26 @@ function canPublish(licenseKey) {
1528
1551
  }
1529
1552
  function buildPlayerMetricEvent() {
1530
1553
  return _async_to_generator(function() {
1531
- var context, flags, _flags_captureAt, _flags_adLoaded, _flags_adDetect, clientInfo, playerId, captureAt;
1554
+ var context, flags, _flags_captureAt, _flags_adLoaded, _flags_adDetect, clientInfo, debugAdTiming, playerId, captureAt;
1532
1555
  var _arguments = arguments;
1533
1556
  return _ts_generator(this, function(_state) {
1534
1557
  switch(_state.label){
1535
1558
  case 0:
1536
1559
  context = _arguments.length > 0 && _arguments[0] !== void 0 ? _arguments[0] : {}, flags = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : {};
1537
1560
  clientInfo = getClientInfo();
1561
+ debugAdTiming = !!context.debugAdTiming;
1562
+ if (debugAdTiming) {
1563
+ console.log("[StormcloudVideoPlayer] clientInfo: ", JSON.stringify(clientInfo, null, 2));
1564
+ }
1538
1565
  return [
1539
1566
  4,
1540
1567
  getBrowserID(clientInfo)
1541
1568
  ];
1542
1569
  case 1:
1543
1570
  playerId = _state.sent();
1571
+ if (debugAdTiming) {
1572
+ console.log("[StormcloudVideoPlayer] playerId: ", playerId);
1573
+ }
1544
1574
  captureAt = (_flags_captureAt = flags.captureAt) !== null && _flags_captureAt !== void 0 ? _flags_captureAt : /* @__PURE__ */ new Date().toISOString();
1545
1575
  return [
1546
1576
  2,
@@ -1672,6 +1702,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
1672
1702
  this.podAssignedByPrefetch = false;
1673
1703
  this.adRequestPositionInBreak = 0;
1674
1704
  this.lastHeartbeatTime = 0;
1705
+ this.defaultPodMaxAds = 6;
1675
1706
  this.config = config;
1676
1707
  this.video = video;
1677
1708
  }
@@ -2127,12 +2158,58 @@ var AdConfigManager = /*#__PURE__*/ function() {
2127
2158
  return urls;
2128
2159
  }
2129
2160
  },
2161
+ {
2162
+ key: "resolvePodParams",
2163
+ value: function resolvePodParams(breakDurationMs) {
2164
+ var maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs;
2165
+ var maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;
2166
+ var minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;
2167
+ return {
2168
+ maxAds: maxAds,
2169
+ minDurationMs: minDurationMs,
2170
+ maxDurationMs: maxDurationMs
2171
+ };
2172
+ }
2173
+ },
2174
+ {
2175
+ key: "generatePodVastUrl",
2176
+ value: function generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {
2177
+ var _podParams_maxDurationMs;
2178
+ var adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;
2179
+ var envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);
2180
+ var urlWithMacros = applyVastMacros(baseUrl, {
2181
+ correlator: generateCorrelator(),
2182
+ streamCorrelator: this.streamCorrelator,
2183
+ pod: this.podCounter > 0 ? this.podCounter : void 0,
2184
+ podMaxAds: podParams.maxAds,
2185
+ podMinDurationMs: podParams.minDurationMs,
2186
+ podMaxDurationMs: podParams.maxDurationMs,
2187
+ isCtv: envSignals.isCtv,
2188
+ contentUrl: envSignals.contentUrl,
2189
+ pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? window.location.href : void 0,
2190
+ adWillPlayMuted: adWillPlayMuted,
2191
+ adWillAutoPlay: !!this.config.autoplay,
2192
+ appId: envSignals.appId,
2193
+ appName: envSignals.appName,
2194
+ sessionId: envSignals.sessionId,
2195
+ deviceId: envSignals.deviceId,
2196
+ deviceIdType: envSignals.deviceIdType,
2197
+ limitAdTracking: envSignals.limitAdTracking,
2198
+ deviceTypeHint: envSignals.deviceTypeHint,
2199
+ adTest: this.config.adTest,
2200
+ consent: this.consentSignals
2201
+ });
2202
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
2203
+ console.log("[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=".concat(this.podCounter, ", pmad=").concat(podParams.maxAds, ", pmnd=").concat(podParams.minDurationMs, ", pmxd=").concat((_podParams_maxDurationMs = podParams.maxDurationMs) !== null && _podParams_maxDurationMs !== void 0 ? _podParams_maxDurationMs : "?", "):"), finalUrl);
2204
+ return finalUrl;
2205
+ }
2206
+ },
2130
2207
  {
2131
2208
  // --- Tracking ---
2132
2209
  key: "initializeTracking",
2133
2210
  value: function initializeTracking() {
2134
2211
  var _this = this;
2135
- sendInitialTracking(this.config.licenseKey).then(function() {
2212
+ sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).then(function() {
2136
2213
  _this.heartbeatInterval = window.setInterval(function() {
2137
2214
  _this.sendHeartbeatIfNeeded();
2138
2215
  }, 5e3);
@@ -2153,7 +2230,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
2153
2230
  var now = Date.now();
2154
2231
  if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {
2155
2232
  this.lastHeartbeatTime = now;
2156
- sendHeartbeat(this.config.licenseKey).catch(function(error) {
2233
+ sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch(function(error) {
2157
2234
  if (_this.debug) {
2158
2235
  console.warn("[StormcloudVideoPlayer] Failed to send heartbeat:", error);
2159
2236
  }