@amazon/vinyl 3.2.0 → 3.2.1

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 (29) hide show
  1. package/dist/index.cjs +30 -24
  2. package/dist/index.cjs.map +2 -2
  3. package/dist/index.js +30 -24
  4. package/dist/index.js.map +2 -2
  5. package/dist/test/integ.es5.js +167 -155
  6. package/dist/test/integ.js +260 -50
  7. package/dist/test/integ.js.map +2 -2
  8. package/dist/types/current/ad/AdControllerImpl.d.ts +18 -2
  9. package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -1
  10. package/dist/types/current/ad/AdControllerImpl.js +42 -20
  11. package/dist/types/current/playback/createStallMonitor.d.ts.map +1 -1
  12. package/dist/types/current/playback/createStallMonitor.js +19 -14
  13. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  14. package/dist/types/ts3.7/ad/AdControllerImpl.d.ts +18 -2
  15. package/dist/types/ts4.1/ad/AdControllerImpl.d.ts +18 -2
  16. package/dist/types/ts4.7/ad/AdControllerImpl.d.ts +18 -2
  17. package/dist/unit/types/current/ad/AdControllerImpl.test.js +110 -4
  18. package/dist/unit/types/current/playback/createStallMonitor.test.js +38 -0
  19. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  20. package/dist/vinylTestUtil/index.js +10 -1
  21. package/dist/vinylTestUtil/index.js.map +2 -2
  22. package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts +5 -0
  23. package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts.map +1 -1
  24. package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.js +9 -0
  25. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  26. package/dist/vinylTestUtil/types/ts3.7/assets/vinylTestAssets.d.ts +5 -0
  27. package/dist/vinylTestUtil/types/ts4.1/assets/vinylTestAssets.d.ts +5 -0
  28. package/dist/vinylTestUtil/types/ts4.7/assets/vinylTestAssets.d.ts +5 -0
  29. package/package.json +10 -10
package/dist/index.cjs CHANGED
@@ -84,6 +84,7 @@ __export(index_exports, {
84
84
  MsCommonMediaKeySystemAccess: () => MsCommonMediaKeySystemAccess,
85
85
  MsCommonMediaKeys: () => MsCommonMediaKeys,
86
86
  MseTrack: () => MseTrack,
87
+ PLAYOUT_LIMIT_TOLERANCE: () => PLAYOUT_LIMIT_TOLERANCE,
87
88
  PLAY_READY_KEY_SYSTEMS: () => PLAY_READY_KEY_SYSTEMS,
88
89
  POLL_BUFFER_THROTTLE: () => POLL_BUFFER_THROTTLE,
89
90
  PREFETCH_POLL_THROTTLE: () => PREFETCH_POLL_THROTTLE,
@@ -353,6 +354,7 @@ var AdError = class _AdError extends import_vinyl_util.ReportableError {
353
354
 
354
355
  // src/ad/AdControllerImpl.ts
355
356
  var AD_START_TOLERANCE = 0.05;
357
+ var PLAYOUT_LIMIT_TOLERANCE = 1;
356
358
  var defaultAdControllerImplOptions = {
357
359
  adLoadTimeout: 15,
358
360
  preloadAheadTime: 10
@@ -843,23 +845,29 @@ var AdControllerImpl = class extends import_vinyl_util2.EventHostImpl {
843
845
  });
844
846
  }
845
847
  /**
846
- * Ads breaks can have a playout limit that may cut off ad playback.
847
- * End the ad if that limit is reached.
848
+ * Enforces the break-level playout limit (X-PLAYOUT-LIMIT): a budget shared
849
+ * across all of the break's ads. When cumulative playout reaches it, the
850
+ * whole break ends, dropping any ads that have not started.
851
+ *
852
+ * This is deliberately NOT a per-ad cap. Each ad asset is its own source and
853
+ * ends on its media `ended` (see the 'ended' handler), which is what advances
854
+ * a multi-ad break. Ending an ad at its declared per-ad DURATION instead would
855
+ * truncate the real asset whenever a packager under-declares it — e.g. rounds
856
+ * a 6.732s asset down to a whole-second 6 — cutting off the fractional tail.
848
857
  */
849
858
  enforcePlayoutLimits(adState) {
859
+ if (!adState.started) return;
860
+ const { parentBreak } = adState;
861
+ const limit = parentBreak.adBreak.playoutLimit;
862
+ if (limit == null) return;
850
863
  const pC = this.deps.playbackController;
851
- const { ad, parentBreak } = adState;
852
- if (adState.started) {
853
- const elapsed = Math.max(0, pC.currentTime - adState.timeStart);
854
- const adBreak = parentBreak.adBreak;
855
- const limit = adBreak.playoutLimit;
856
- if (limit != null && parentBreak.playoutElapsed + elapsed >= limit) {
857
- parentBreak.clear();
858
- this.endAd(adState);
859
- } else if (ad.duration != null && elapsed >= ad.duration) {
860
- this.endAd(adState);
861
- }
864
+ const elapsed = Math.max(0, pC.currentTime - adState.timeStart);
865
+ if (parentBreak.playoutElapsed + elapsed < limit) return;
866
+ if (isFinite(pC.duration) && pC.duration > 0 && pC.duration - pC.currentTime <= PLAYOUT_LIMIT_TOLERANCE) {
867
+ return;
862
868
  }
869
+ parentBreak.clear();
870
+ this.endAd(adState);
863
871
  }
864
872
  setPendingBreaks(newPending) {
865
873
  this.pendingAdBreaks = newPending.filter(
@@ -2817,7 +2825,7 @@ function configureVinylGlobal(options) {
2817
2825
  var import_vinyl_util27 = require("@amazon/vinyl-util");
2818
2826
  var vinylVersion = /* @__PURE__ */ (0, import_vinyl_util27.parseVersion)(
2819
2827
  /* istanbul ignore next */
2820
- "3.2.0"
2828
+ "3.2.1"
2821
2829
  );
2822
2830
 
2823
2831
  // src/global/globalRef.ts
@@ -3016,6 +3024,7 @@ var PlaybackNetworkState = /* @__PURE__ */ ((PlaybackNetworkState2) => {
3016
3024
  })(PlaybackNetworkState || {});
3017
3025
 
3018
3026
  // src/playback/createStallMonitor.ts
3027
+ var PROGRESS_EPSILON = 1e-6;
3019
3028
  function createStallMonitor(controller, callbacks, options = {}) {
3020
3029
  var _a, _b;
3021
3030
  const stallThresholdMs = ((_a = options.stallThreshold) != null ? _a : 1) * 1e3;
@@ -3024,6 +3033,7 @@ function createStallMonitor(controller, callbacks, options = {}) {
3024
3033
  let lastProgressAt = Date.now();
3025
3034
  let inStall = false;
3026
3035
  let pollId = null;
3036
+ const { add, dispose } = (0, import_vinyl_util30.createDisposer)();
3027
3037
  const endStall = (reason) => {
3028
3038
  if (!inStall) return;
3029
3039
  inStall = false;
@@ -3040,6 +3050,7 @@ function createStallMonitor(controller, callbacks, options = {}) {
3040
3050
  clearInterval(pollId);
3041
3051
  pollId = null;
3042
3052
  };
3053
+ add(stopPoll);
3043
3054
  const startPoll = () => {
3044
3055
  if (pollId != null) return;
3045
3056
  pollId = setInterval(() => {
@@ -3055,17 +3066,18 @@ function createStallMonitor(controller, callbacks, options = {}) {
3055
3066
  observedPlaying = false;
3056
3067
  stopPoll();
3057
3068
  };
3058
- const { add, dispose } = (0, import_vinyl_util30.createDisposer)();
3059
3069
  add(
3060
3070
  controller.on("playing", () => {
3061
3071
  if (inStall) endStall("playing" /* PLAYING */);
3062
- else lastProgressAt = Date.now();
3072
+ lastProgressAt = Date.now();
3063
3073
  observedPlaying = true;
3064
3074
  startPoll();
3065
3075
  })
3066
3076
  );
3067
3077
  add(
3068
- controller.on("timeUpdate", () => {
3078
+ controller.on("timeUpdate", ({ previous, current }) => {
3079
+ if (previous != null && current - previous <= PROGRESS_EPSILON)
3080
+ return;
3069
3081
  if (inStall) endStall("playing" /* PLAYING */);
3070
3082
  lastProgressAt = Date.now();
3071
3083
  })
@@ -3073,13 +3085,7 @@ function createStallMonitor(controller, callbacks, options = {}) {
3073
3085
  add(controller.on("pause", () => suspend("pause" /* PAUSE */)));
3074
3086
  add(controller.on("seeking", () => suspend("seeking" /* SEEKING */)));
3075
3087
  add(controller.on("emptied", () => suspend("emptied" /* EMPTIED */)));
3076
- let stopped = false;
3077
- return () => {
3078
- if (stopped) return;
3079
- stopped = true;
3080
- stopPoll();
3081
- dispose();
3082
- };
3088
+ return dispose;
3083
3089
  }
3084
3090
 
3085
3091
  // src/playback/error/InvalidSeekError.ts