@amazon/vinyl 3.2.2 → 3.2.3-next.20261001143710

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 (92) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +62 -21
  3. package/dist/index.cjs.map +3 -3
  4. package/dist/index.js +65 -22
  5. package/dist/index.js.map +3 -3
  6. package/dist/test/benchmark.es5.js +7 -6
  7. package/dist/test/benchmark.js +35 -30
  8. package/dist/test/benchmark.js.map +3 -3
  9. package/dist/test/integ.es5.js +184 -171
  10. package/dist/test/integ.js +450 -165
  11. package/dist/test/integ.js.map +4 -4
  12. package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -1
  13. package/dist/types/current/ad/AdControllerImpl.js +15 -1
  14. package/dist/types/current/ad/discoverHlsInterstitials.js +13 -1
  15. package/dist/types/current/drm/commonEme/MsCommonEme.d.ts.map +1 -1
  16. package/dist/types/current/drm/commonEme/MsCommonEme.js +2 -2
  17. package/dist/types/current/drm/commonEme/StandardCommonEme.d.ts.map +1 -1
  18. package/dist/types/current/drm/commonEme/StandardCommonEme.js +3 -2
  19. package/dist/types/current/drm/commonEme/WebKitCommonEme.d.ts.map +1 -1
  20. package/dist/types/current/drm/commonEme/WebKitCommonEme.js +2 -2
  21. package/dist/types/current/drm/dom/MSMediaKeys.d.ts +1 -1
  22. package/dist/types/current/drm/dom/MSMediaKeys.d.ts.map +1 -1
  23. package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts +1 -1
  24. package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts.map +1 -1
  25. package/dist/types/current/drm/util/extractContentId.js +2 -2
  26. package/dist/types/current/playback/PlaybackControllerImpl.d.ts +1 -1
  27. package/dist/types/current/streaming/MediaQualityMetadata.d.ts +3 -1
  28. package/dist/types/current/streaming/MediaQualityMetadata.d.ts.map +1 -1
  29. package/dist/types/current/streaming/SegmentControllerImpl.d.ts +1 -1
  30. package/dist/types/current/streaming/buffering/BufferingController.d.ts +1 -1
  31. package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
  32. package/dist/types/current/streaming/buffering/BufferingController.js +14 -5
  33. package/dist/types/current/streaming/buffering/MediaSourceController.d.ts.map +1 -1
  34. package/dist/types/current/streaming/buffering/MediaSourceController.js +4 -0
  35. package/dist/types/current/text/discoverDashTextTracks.d.ts +2 -2
  36. package/dist/types/current/text/discoverDashTextTracks.js +4 -3
  37. package/dist/types/current/text/parseWebVtt.d.ts.map +1 -1
  38. package/dist/types/current/text/parseWebVtt.js +3 -2
  39. package/dist/types/current/track/TrackController.d.ts.map +1 -1
  40. package/dist/types/current/track/TrackController.js +7 -0
  41. package/dist/types/current/track/hls/HlsManifestData.d.ts +14 -1
  42. package/dist/types/current/track/hls/HlsManifestData.d.ts.map +1 -1
  43. package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts.map +1 -1
  44. package/dist/types/current/track/hls/buildHlsMediaTimeline.js +10 -2
  45. package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  46. package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts.map +1 -1
  47. package/dist/types/current/track/hls/createUrlHlsManifestProvider.js +8 -3
  48. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  49. package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +1 -1
  50. package/dist/types/ts3.7/streaming/MediaQualityMetadata.d.ts +3 -1
  51. package/dist/types/ts3.7/streaming/SegmentControllerImpl.d.ts +1 -1
  52. package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +1 -1
  53. package/dist/types/ts3.7/text/discoverDashTextTracks.d.ts +2 -2
  54. package/dist/types/ts3.7/track/hls/HlsManifestData.d.ts +14 -1
  55. package/dist/types/ts3.7/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  56. package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +1 -1
  57. package/dist/types/ts4.1/streaming/MediaQualityMetadata.d.ts +3 -1
  58. package/dist/types/ts4.1/streaming/SegmentControllerImpl.d.ts +1 -1
  59. package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +1 -1
  60. package/dist/types/ts4.1/text/discoverDashTextTracks.d.ts +2 -2
  61. package/dist/types/ts4.1/track/hls/HlsManifestData.d.ts +14 -1
  62. package/dist/types/ts4.1/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  63. package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +1 -1
  64. package/dist/types/ts4.7/streaming/MediaQualityMetadata.d.ts +3 -1
  65. package/dist/types/ts4.7/streaming/SegmentControllerImpl.d.ts +1 -1
  66. package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +1 -1
  67. package/dist/types/ts4.7/text/discoverDashTextTracks.d.ts +2 -2
  68. package/dist/types/ts4.7/track/hls/HlsManifestData.d.ts +14 -1
  69. package/dist/types/ts4.7/track/hls/createUrlHlsManifestProvider.d.ts +3 -2
  70. package/dist/unit/types/current/ad/AdControllerImpl.test.js +66 -0
  71. package/dist/unit/types/current/ad/discoverHlsInterstitials.test.js +29 -2
  72. package/dist/unit/types/current/drm/commonEme/StandardCommonEme.test.js +12 -4
  73. package/dist/unit/types/current/drm/util/extractContentId.test.js +7 -0
  74. package/dist/unit/types/current/index.d.ts +1 -0
  75. package/dist/unit/types/current/index.d.ts.map +1 -1
  76. package/dist/unit/types/current/index.js +1 -0
  77. package/dist/unit/types/current/streaming/MediaQualityMetadata.test.js +8 -0
  78. package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +26 -0
  79. package/dist/unit/types/current/streaming/buffering/MediaSourceController.test.js +29 -0
  80. package/dist/unit/types/current/text/TextTrack.test.d.ts +2 -0
  81. package/dist/unit/types/current/text/TextTrack.test.d.ts.map +1 -0
  82. package/dist/unit/types/current/text/TextTrack.test.js +12 -0
  83. package/dist/unit/types/current/text/discoverDashTextTracks.test.js +17 -0
  84. package/dist/unit/types/current/text/parseWebVtt.test.js +26 -0
  85. package/dist/unit/types/current/track/TrackController.test.js +15 -60
  86. package/dist/unit/types/current/track/hls/buildHlsMediaTimeline.test.js +22 -0
  87. package/dist/unit/types/current/track/hls/createUrlHlsManifestProvider.test.js +23 -0
  88. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  89. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  90. package/docs/CUSTOMIZATION_GUIDE.md +310 -0
  91. package/package.json +10 -10
  92. package/docs/DASH_MANIFEST_TRANSFORM_GUIDE.md +0 -236
package/dist/index.js CHANGED
@@ -383,7 +383,11 @@ var AdControllerImpl = class extends EventHostImpl {
383
383
  logVerbose(this, "nextAd");
384
384
  try {
385
385
  const ad = await adBreakState2.nextAd();
386
- if (this.disposed || adBreakState2.completedReason) return;
386
+ if (this.disposed) return;
387
+ if (adBreakState2.completedReason) {
388
+ if (!this.adBreakState) await nextBreak();
389
+ return;
390
+ }
387
391
  if (ad) {
388
392
  this.startAd(ad);
389
393
  } else {
@@ -517,12 +521,18 @@ var AdControllerImpl = class extends EventHostImpl {
517
521
  const currProgress = pC.currentTimePercent;
518
522
  const progressStart = adState.timeStart / pC.duration;
519
523
  if (!adState.quartile.first && currProgress > 0.25 && progressStart < AD_START_TOLERANCE) {
524
+ adState.quartile.first = true;
525
+ logDebug(this, "adFirstQuartile", adState.ad);
520
526
  this.dispatch("adFirstQuartile", createAdProgressEvent(adState));
521
527
  }
522
528
  if (!adState.quartile.midpoint && currProgress > 0.5 && progressStart < 0.25 + AD_START_TOLERANCE) {
529
+ adState.quartile.midpoint = true;
530
+ logDebug(this, "adMidpoint", adState.ad);
523
531
  this.dispatch("adMidpoint", createAdProgressEvent(adState));
524
532
  }
525
533
  if (!adState.quartile.third && currProgress > 0.75 && progressStart < 0.5 + AD_START_TOLERANCE) {
534
+ adState.quartile.third = true;
535
+ logDebug(this, "adThirdQuartile", adState.ad);
526
536
  this.dispatch("adThirdQuartile", createAdProgressEvent(adState));
527
537
  }
528
538
  }
@@ -939,6 +949,7 @@ async function resolveHlsAssetList({
939
949
  const url = resolveUrl(assetListUrl, baseUrl);
940
950
  const response = await requestWithRetry2(url);
941
951
  const json = await readResponseBody(response, "json");
952
+ const assetListBaseUrl = response.url || url;
942
953
  const assets = (_a = json.ASSETS) != null ? _a : [];
943
954
  const ads = assets.map((asset, i) => {
944
955
  var _a2;
@@ -946,7 +957,14 @@ async function resolveHlsAssetList({
946
957
  id: `${rangeId}-${i}`,
947
958
  startTime,
948
959
  duration: (_a2 = asset.DURATION) != null ? _a2 : null,
949
- uri: resolveUrl(asset.URI, baseUrl)
960
+ // Each Asset-Description "URI" MUST be an absolute URI, so the base
961
+ // only applies to non-conforming lists. As a leniency (not a spec
962
+ // rule), resolve against the asset list the URI was read from, as
963
+ // for any relative reference in a retrieved document (RFC 3986
964
+ // §5.1.3): asset lists are commonly served by an ad server rather
965
+ // than alongside the playlist.
966
+ // @see https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis-22#appendix-D.2
967
+ uri: resolveUrl(asset.URI, assetListBaseUrl)
950
968
  };
951
969
  });
952
970
  return { ads, skipControl: parseSkipControl(json["SKIP-CONTROL"]) };
@@ -1152,6 +1170,7 @@ var MediaKeySessionErrorType = /* @__PURE__ */ ((MediaKeySessionErrorType2) => {
1152
1170
 
1153
1171
  // src/drm/commonEme/MsCommonEme.ts
1154
1172
  import {
1173
+ bufferToArrayBuffer,
1155
1174
  bufferToByteArray,
1156
1175
  DisposedError,
1157
1176
  ErrorOrigin as ErrorOrigin5,
@@ -1271,7 +1290,7 @@ var MsCommonMediaKeySession = class extends EventHostImpl2 {
1271
1290
  __publicField(this, "_disposed", false);
1272
1291
  __publicField(this, "messageHandler", (event) => {
1273
1292
  this.dispatch("message", {
1274
- message: event.message.buffer
1293
+ message: bufferToArrayBuffer(event.message)
1275
1294
  });
1276
1295
  });
1277
1296
  __publicField(this, "errorHandler", () => {
@@ -1422,11 +1441,7 @@ var StandardCommonMediaKeySession = class extends EventHostImpl3 {
1422
1441
  return "StandardCommonMediaKeySession";
1423
1442
  }
1424
1443
  generateRequest() {
1425
- const initData = this.initData;
1426
- return this.session.generateRequest(
1427
- this.initDataType,
1428
- initData instanceof ArrayBuffer ? initData : initData.buffer
1429
- ).catch(createDrmErrorHandler());
1444
+ return this.session.generateRequest(this.initDataType, this.initData).catch(createDrmErrorHandler());
1430
1445
  }
1431
1446
  update(key) {
1432
1447
  if (this.disposed) throw new DisposedError2();
@@ -1445,6 +1460,7 @@ var StandardCommonMediaKeySession = class extends EventHostImpl3 {
1445
1460
 
1446
1461
  // src/drm/commonEme/WebKitCommonEme.ts
1447
1462
  import {
1463
+ bufferToArrayBuffer as bufferToArrayBuffer2,
1448
1464
  bufferToByteArray as bufferToByteArray2,
1449
1465
  DisposedError as DisposedError3,
1450
1466
  ErrorOrigin as ErrorOrigin7,
@@ -1540,7 +1556,7 @@ var WebKitCommonMediaKeySession = class extends EventHostImpl4 {
1540
1556
  __publicField(this, "_disposed", false);
1541
1557
  __publicField(this, "messageHandler", (event) => {
1542
1558
  this.dispatch("message", {
1543
- message: event.message.buffer
1559
+ message: bufferToArrayBuffer2(event.message)
1544
1560
  });
1545
1561
  });
1546
1562
  __publicField(this, "errorHandler", () => {
@@ -1842,9 +1858,9 @@ var defaultLicenseProvider = async (keySystem, serverOptions, challenge, abort)
1842
1858
  // src/drm/util/extractContentId.ts
1843
1859
  import { ValidationError as ValidationError2 } from "@amazon/vinyl-util";
1844
1860
  import { ErrorOrigin as ErrorOrigin8 } from "@amazon/vinyl-util";
1845
- import { bufferToUtf16 as bufferToUtf162 } from "@amazon/vinyl-util";
1861
+ import { bufferToArrayBuffer as bufferToArrayBuffer3, bufferToUtf16 as bufferToUtf162 } from "@amazon/vinyl-util";
1846
1862
  function extractContentId(initData) {
1847
- const bufferStr = bufferToUtf162(initData.buffer);
1863
+ const bufferStr = bufferToUtf162(bufferToArrayBuffer3(initData));
1848
1864
  const matches = bufferStr.match(/skd:\/\/(.+)$/);
1849
1865
  if (!matches) {
1850
1866
  throw new ValidationError2("No contentId match", ErrorOrigin8.MEDIA);
@@ -4339,14 +4355,16 @@ var BufferingControllerImpl = class extends EventHostImpl8 {
4339
4355
  return;
4340
4356
  }
4341
4357
  const byteLength = streamingSegment.data.byteLength;
4342
- if (byteLength > appendSize) {
4358
+ const remaining = byteLength - this.appendOffset;
4359
+ const firstAppend = this.appendOffset === 0;
4360
+ if (remaining > appendSize) {
4343
4361
  const newOffset = this.appendOffset + appendSize;
4344
4362
  const chunk = streamingSegment.data.slice(
4345
4363
  this.appendOffset,
4346
4364
  newOffset
4347
4365
  );
4348
4366
  await sourceBufferController.append(chunk);
4349
- if (this.appendOffset === 0) {
4367
+ if (firstAppend) {
4350
4368
  this.buffered.push(streamingSegment);
4351
4369
  }
4352
4370
  this.appendOffset = newOffset;
@@ -4355,9 +4373,13 @@ var BufferingControllerImpl = class extends EventHostImpl8 {
4355
4373
  `appended chunk, this.appendOffset: ${this.appendOffset}`
4356
4374
  );
4357
4375
  } else {
4358
- await sourceBufferController.append(streamingSegment.data);
4359
- this.appendOffset = streamingSegment.data.byteLength;
4360
- this.buffered.push(streamingSegment);
4376
+ await sourceBufferController.append(
4377
+ firstAppend ? streamingSegment.data : streamingSegment.data.slice(this.appendOffset)
4378
+ );
4379
+ this.appendOffset = byteLength;
4380
+ if (firstAppend) {
4381
+ this.buffered.push(streamingSegment);
4382
+ }
4361
4383
  }
4362
4384
  if (!tail) this.refreshHead();
4363
4385
  }
@@ -4659,6 +4681,7 @@ var MediaSourceControllerImpl = class extends EventHostImpl9 {
4659
4681
  this.activateDisposer.dispose();
4660
4682
  this.activateDisposer = null;
4661
4683
  ++this.durationToken;
4684
+ this.durationSet = false;
4662
4685
  try {
4663
4686
  URL.revokeObjectURL(this.objectUrl);
4664
4687
  } catch (error) {
@@ -6555,10 +6578,16 @@ function discoverDashTextTracks(manifest, baseUrl) {
6555
6578
  return out;
6556
6579
  }
6557
6580
  function isTextAdaptationSet(adaptationSet) {
6581
+ var _a;
6558
6582
  if (adaptationSet.contentType === "text") return true;
6559
6583
  const mt = adaptationSet.mimeType;
6560
6584
  if (mt && mt.startsWith("text/")) return true;
6561
- return false;
6585
+ return ((_a = adaptationSet.Representation) != null ? _a : []).some(
6586
+ (representation) => {
6587
+ var _a2;
6588
+ return (_a2 = representation.mimeType) == null ? void 0 : _a2.startsWith("text/");
6589
+ }
6590
+ );
6562
6591
  }
6563
6592
  function isSidecarTextMime(mimeType) {
6564
6593
  if (mimeType == null) return true;
@@ -6818,7 +6847,7 @@ function parseWebVtt(input) {
6818
6847
  const cues = [];
6819
6848
  const styles = [];
6820
6849
  let i = 1;
6821
- while (i < lines.length && lines[i] !== "") i++;
6850
+ while (i < lines.length && lines[i] !== "" && !lines[i].includes("-->")) i++;
6822
6851
  while (i < lines.length) {
6823
6852
  if (lines[i] === "") {
6824
6853
  i++;
@@ -9649,7 +9678,11 @@ function createHlsQualityData(deps, data3, baseUrl, playlistUri, metadata) {
9649
9678
  async getSegment(time, affordance = 0) {
9650
9679
  var _a;
9651
9680
  const playlist = await data3.getMediaPlaylist(playlistUri);
9652
- const playlistBaseUrl = resolveUrl8(playlistUri, baseUrl);
9681
+ const playlistBaseUrl = getPlaylistBaseUrl(
9682
+ playlist,
9683
+ playlistUri,
9684
+ baseUrl
9685
+ );
9653
9686
  const segments = buildSegmentTimeline(
9654
9687
  deps,
9655
9688
  playlistBaseUrl,
@@ -9696,9 +9729,13 @@ async function discoverAdsFromManifest(data3) {
9696
9729
  const variant = data3.mainPlaylist.variants[0];
9697
9730
  const media = await data3.getMediaPlaylist(variant.uri);
9698
9731
  const contentDuration = media.ended ? media.segments.reduce((sum, s) => sum + s.duration, 0) : null;
9699
- const playlistBaseUrl = resolveUrl8(variant.uri, data3.baseUrl);
9732
+ const playlistBaseUrl = getPlaylistBaseUrl(media, variant.uri, data3.baseUrl);
9700
9733
  return discoverHlsInterstitials(media, playlistBaseUrl, contentDuration);
9701
9734
  }
9735
+ function getPlaylistBaseUrl(playlist, playlistUri, mainBaseUrl) {
9736
+ var _a;
9737
+ return (_a = playlist.baseUrl) != null ? _a : resolveUrl8(playlistUri, mainBaseUrl);
9738
+ }
9702
9739
 
9703
9740
  // src/track/hls/createDefaultHlsManifestTransformer.ts
9704
9741
  function createDefaultHlsManifestTransformer(deps) {
@@ -9849,8 +9886,11 @@ async function fetchMediaPlaylist(options) {
9849
9886
  const variantUrl = resolveUrl9(uri, baseUrl);
9850
9887
  const response = await requestWithRetry7(variantUrl, requestInit, { abort });
9851
9888
  const text = await readResponseBody6(response, "text");
9852
- const queryParams = parseQueryParams(response.url || variantUrl);
9853
- return parseMediaPlaylist2(text, defines, queryParams);
9889
+ const playlistUrl = response.url || variantUrl;
9890
+ const queryParams = parseQueryParams(playlistUrl);
9891
+ return __spreadProps(__spreadValues({}, parseMediaPlaylist2(text, defines, queryParams)), {
9892
+ baseUrl: playlistUrl
9893
+ });
9854
9894
  }
9855
9895
  function parseQueryParams(url) {
9856
9896
  const queryStart = url.indexOf("?");
@@ -10318,6 +10358,9 @@ var TrackControllerImpl = class extends EventHostImpl17 {
10318
10358
  for (const cachedTrack of this.trackCache.values()) {
10319
10359
  cachedTrack.clearPrefetch();
10320
10360
  }
10361
+ for (const adTracks of this.adTracksByParent.values()) {
10362
+ for (const adTrack of adTracks.values()) adTrack.clearPrefetch();
10363
+ }
10321
10364
  }
10322
10365
  clearQueue() {
10323
10366
  this.setQueue(this._current, []);