@amazon/vinyl 3.2.3-next.20261001224604 → 3.2.3-next.20261010160052

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 (124) hide show
  1. package/dist/index.cjs +199 -23
  2. package/dist/index.cjs.map +4 -4
  3. package/dist/index.js +222 -44
  4. package/dist/index.js.map +4 -4
  5. package/dist/test/integ.es5.js +194 -187
  6. package/dist/test/integ.js +1092 -256
  7. package/dist/test/integ.js.map +4 -4
  8. package/dist/types/current/drm/DrmController.d.ts +20 -0
  9. package/dist/types/current/drm/DrmController.d.ts.map +1 -1
  10. package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
  11. package/dist/types/current/drm/DrmControllerImpl.js +81 -16
  12. package/dist/types/current/drm/DrmKeySystem.d.ts +22 -2
  13. package/dist/types/current/drm/DrmKeySystem.d.ts.map +1 -1
  14. package/dist/types/current/drm/DrmKeySystem.js +22 -1
  15. package/dist/types/current/drm/DrmOptions.d.ts +24 -1
  16. package/dist/types/current/drm/DrmOptions.d.ts.map +1 -1
  17. package/dist/types/current/drm/DrmOptions.js +2 -1
  18. package/dist/types/current/drm/commonEme/CommonEme.d.ts +28 -0
  19. package/dist/types/current/drm/commonEme/CommonEme.d.ts.map +1 -1
  20. package/dist/types/current/drm/commonEme/CommonEmeFactory.d.ts +18 -4
  21. package/dist/types/current/drm/commonEme/CommonEmeFactory.d.ts.map +1 -1
  22. package/dist/types/current/drm/commonEme/CommonEmeFactory.js +13 -6
  23. package/dist/types/current/drm/commonEme/MsCommonEme.d.ts +1 -0
  24. package/dist/types/current/drm/commonEme/MsCommonEme.d.ts.map +1 -1
  25. package/dist/types/current/drm/commonEme/MsCommonEme.js +14 -0
  26. package/dist/types/current/drm/commonEme/StandardCommonEme.d.ts +1 -0
  27. package/dist/types/current/drm/commonEme/StandardCommonEme.d.ts.map +1 -1
  28. package/dist/types/current/drm/commonEme/StandardCommonEme.js +22 -0
  29. package/dist/types/current/drm/commonEme/WebKitCommonEme.d.ts +1 -0
  30. package/dist/types/current/drm/commonEme/WebKitCommonEme.d.ts.map +1 -1
  31. package/dist/types/current/drm/commonEme/WebKitCommonEme.js +14 -0
  32. package/dist/types/current/drm/dom/MSMediaKeys.d.ts +1 -0
  33. package/dist/types/current/drm/dom/MSMediaKeys.d.ts.map +1 -1
  34. package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts +1 -0
  35. package/dist/types/current/drm/dom/WebKitMediaKeys.d.ts.map +1 -1
  36. package/dist/types/current/index.d.ts +1 -0
  37. package/dist/types/current/index.d.ts.map +1 -1
  38. package/dist/types/current/index.js +1 -0
  39. package/dist/types/current/streaming/MediaQualityMetadata.d.ts +6 -0
  40. package/dist/types/current/streaming/MediaQualityMetadata.d.ts.map +1 -1
  41. package/dist/types/current/streaming/MediaQualityMetadata.js +1 -0
  42. package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts +2 -1
  43. package/dist/types/current/track/hls/buildHlsMediaTimeline.d.ts.map +1 -1
  44. package/dist/types/current/track/hls/buildHlsMediaTimeline.js +5 -1
  45. package/dist/types/current/track/hls/util/hlsKeyDrmInfo.d.ts +33 -0
  46. package/dist/types/current/track/hls/util/hlsKeyDrmInfo.d.ts.map +1 -0
  47. package/dist/types/current/track/hls/util/hlsKeyDrmInfo.js +78 -0
  48. package/dist/types/current/tsconfig.tsbuildinfo +1 -1
  49. package/dist/types/current/vinyl/VinylPlayer.d.ts +2 -1
  50. package/dist/types/current/vinyl/VinylPlayer.d.ts.map +1 -1
  51. package/dist/types/current/vinyl/VinylPlayer.js +4 -1
  52. package/dist/types/current/vinyl/createVinylFactories.d.ts +1 -2
  53. package/dist/types/current/vinyl/createVinylFactories.d.ts.map +1 -1
  54. package/dist/types/current/vinyl/createVinylFactories.js +3 -1
  55. package/dist/types/ts3.7/drm/DrmController.d.ts +20 -0
  56. package/dist/types/ts3.7/drm/DrmKeySystem.d.ts +22 -2
  57. package/dist/types/ts3.7/drm/DrmOptions.d.ts +24 -1
  58. package/dist/types/ts3.7/drm/commonEme/CommonEme.d.ts +28 -0
  59. package/dist/types/ts3.7/drm/commonEme/CommonEmeFactory.d.ts +18 -4
  60. package/dist/types/ts3.7/drm/commonEme/MsCommonEme.d.ts +1 -0
  61. package/dist/types/ts3.7/drm/commonEme/StandardCommonEme.d.ts +1 -0
  62. package/dist/types/ts3.7/drm/commonEme/WebKitCommonEme.d.ts +1 -0
  63. package/dist/types/ts3.7/drm/dom/MSMediaKeys.d.ts +1 -0
  64. package/dist/types/ts3.7/drm/dom/WebKitMediaKeys.d.ts +1 -0
  65. package/dist/types/ts3.7/index.d.ts +1 -0
  66. package/dist/types/ts3.7/streaming/MediaQualityMetadata.d.ts +6 -0
  67. package/dist/types/ts3.7/track/hls/buildHlsMediaTimeline.d.ts +2 -1
  68. package/dist/types/ts3.7/track/hls/util/hlsKeyDrmInfo.d.ts +33 -0
  69. package/dist/types/ts3.7/vinyl/VinylPlayer.d.ts +2 -1
  70. package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +1 -2
  71. package/dist/types/ts4.1/drm/DrmController.d.ts +20 -0
  72. package/dist/types/ts4.1/drm/DrmKeySystem.d.ts +22 -2
  73. package/dist/types/ts4.1/drm/DrmOptions.d.ts +24 -1
  74. package/dist/types/ts4.1/drm/commonEme/CommonEme.d.ts +28 -0
  75. package/dist/types/ts4.1/drm/commonEme/CommonEmeFactory.d.ts +18 -4
  76. package/dist/types/ts4.1/drm/commonEme/MsCommonEme.d.ts +1 -0
  77. package/dist/types/ts4.1/drm/commonEme/StandardCommonEme.d.ts +1 -0
  78. package/dist/types/ts4.1/drm/commonEme/WebKitCommonEme.d.ts +1 -0
  79. package/dist/types/ts4.1/drm/dom/MSMediaKeys.d.ts +1 -0
  80. package/dist/types/ts4.1/drm/dom/WebKitMediaKeys.d.ts +1 -0
  81. package/dist/types/ts4.1/index.d.ts +1 -0
  82. package/dist/types/ts4.1/streaming/MediaQualityMetadata.d.ts +6 -0
  83. package/dist/types/ts4.1/track/hls/buildHlsMediaTimeline.d.ts +2 -1
  84. package/dist/types/ts4.1/track/hls/util/hlsKeyDrmInfo.d.ts +33 -0
  85. package/dist/types/ts4.1/vinyl/VinylPlayer.d.ts +2 -1
  86. package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +1 -2
  87. package/dist/types/ts4.7/drm/DrmController.d.ts +20 -0
  88. package/dist/types/ts4.7/drm/DrmKeySystem.d.ts +22 -2
  89. package/dist/types/ts4.7/drm/DrmOptions.d.ts +24 -1
  90. package/dist/types/ts4.7/drm/commonEme/CommonEme.d.ts +28 -0
  91. package/dist/types/ts4.7/drm/commonEme/CommonEmeFactory.d.ts +18 -4
  92. package/dist/types/ts4.7/drm/commonEme/MsCommonEme.d.ts +1 -0
  93. package/dist/types/ts4.7/drm/commonEme/StandardCommonEme.d.ts +1 -0
  94. package/dist/types/ts4.7/drm/commonEme/WebKitCommonEme.d.ts +1 -0
  95. package/dist/types/ts4.7/drm/dom/MSMediaKeys.d.ts +1 -0
  96. package/dist/types/ts4.7/drm/dom/WebKitMediaKeys.d.ts +1 -0
  97. package/dist/types/ts4.7/index.d.ts +1 -0
  98. package/dist/types/ts4.7/streaming/MediaQualityMetadata.d.ts +6 -0
  99. package/dist/types/ts4.7/track/hls/buildHlsMediaTimeline.d.ts +2 -1
  100. package/dist/types/ts4.7/track/hls/util/hlsKeyDrmInfo.d.ts +33 -0
  101. package/dist/types/ts4.7/vinyl/VinylPlayer.d.ts +2 -1
  102. package/dist/types/ts4.7/vinyl/createVinylFactories.d.ts +1 -2
  103. package/dist/unit/types/current/drm/CommonEmeFactory.test.js +92 -56
  104. package/dist/unit/types/current/drm/DrmControllerImpl.test.js +183 -1
  105. package/dist/unit/types/current/drm/DrmKeySystem.test.js +1 -0
  106. package/dist/unit/types/current/drm/DrmKeySystemResolver.test.js +5 -1
  107. package/dist/unit/types/current/drm/DrmOptions.test.d.ts +2 -0
  108. package/dist/unit/types/current/drm/DrmOptions.test.d.ts.map +1 -0
  109. package/dist/unit/types/current/drm/DrmOptions.test.js +23 -0
  110. package/dist/unit/types/current/drm/commonEme/MsCommonEme.test.js +21 -0
  111. package/dist/unit/types/current/drm/commonEme/StandardCommonEme.test.js +32 -0
  112. package/dist/unit/types/current/drm/commonEme/WebKitCommonEme.test.js +21 -0
  113. package/dist/unit/types/current/index.d.ts +2 -0
  114. package/dist/unit/types/current/index.d.ts.map +1 -1
  115. package/dist/unit/types/current/index.js +2 -0
  116. package/dist/unit/types/current/track/hls/buildHlsMediaTimeline.test.js +48 -1
  117. package/dist/unit/types/current/track/hls/util/hlsKeyDrmInfo.test.d.ts +2 -0
  118. package/dist/unit/types/current/track/hls/util/hlsKeyDrmInfo.test.d.ts.map +1 -0
  119. package/dist/unit/types/current/track/hls/util/hlsKeyDrmInfo.test.js +89 -0
  120. package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
  121. package/dist/unit/types/current/vinyl/VinylPlayer.test.js +18 -1
  122. package/dist/unit/types/current/vinyl/createVinylFactories.test.js +29 -1
  123. package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
  124. package/package.json +10 -10
package/dist/index.cjs CHANGED
@@ -245,6 +245,7 @@ __export(index_exports, {
245
245
  getSegmentTemplate: () => getSegmentTemplate,
246
246
  getSourceBufferQuota: () => getSourceBufferQuota,
247
247
  hlsByteRangeToMediaRange: () => hlsByteRangeToMediaRange,
248
+ hlsKeyDrmInfo: () => hlsKeyDrmInfo,
248
249
  immediatePrefetchPriority: () => immediatePrefetchPriority,
249
250
  inferTrackTypeFromUrl: () => inferTrackTypeFromUrl,
250
251
  inferTrackTypeFromUrlPath: () => inferTrackTypeFromUrlPath,
@@ -1579,8 +1580,21 @@ var MsCommonMediaKeySession = class extends import_vinyl_util13.EventHostImpl {
1579
1580
  this.dispatch("error", { error, target: this });
1580
1581
  }
1581
1582
  });
1583
+ // Prefixed EME reports no key ids or statuses; a key was added for the
1584
+ // session's init data.
1585
+ __publicField(this, "keyAddedHandler", () => {
1586
+ this.dispatch("keyStatusesChange", {
1587
+ keyStatuses: [
1588
+ {
1589
+ keyId: (0, import_vinyl_util13.bufferToByteArray)(this.initData).slice().buffer,
1590
+ status: "usable"
1591
+ }
1592
+ ]
1593
+ });
1594
+ });
1582
1595
  session.addEventListener("mskeymessage", this.messageHandler);
1583
1596
  session.addEventListener("mskeyerror", this.errorHandler);
1597
+ session.addEventListener("mskeyadded", this.keyAddedHandler);
1584
1598
  }
1585
1599
  update(key) {
1586
1600
  if (this.disposed) return Promise.reject(new import_vinyl_util13.DisposedError());
@@ -1596,6 +1610,7 @@ var MsCommonMediaKeySession = class extends import_vinyl_util13.EventHostImpl {
1596
1610
  this.session.close();
1597
1611
  this.session.removeEventListener("mskeymessage", this.messageHandler);
1598
1612
  this.session.removeEventListener("mskeyerror", this.errorHandler);
1613
+ this.session.removeEventListener("mskeyadded", this.keyAddedHandler);
1599
1614
  }
1600
1615
  };
1601
1616
  function msErrorCodeToStr(code) {
@@ -1679,6 +1694,10 @@ var StandardCommonMediaKeys = class {
1679
1694
  );
1680
1695
  }
1681
1696
  };
1697
+ function copyKeyId(keyId) {
1698
+ const bytes = keyId instanceof ArrayBuffer ? new Uint8Array(keyId) : new Uint8Array(keyId.buffer, keyId.byteOffset, keyId.byteLength);
1699
+ return bytes.slice().buffer;
1700
+ }
1682
1701
  var StandardCommonMediaKeySession = class extends import_vinyl_util15.EventHostImpl {
1683
1702
  constructor(session, mimeType, initDataType, initData) {
1684
1703
  super();
@@ -1692,7 +1711,21 @@ var StandardCommonMediaKeySession = class extends import_vinyl_util15.EventHostI
1692
1711
  message: event.message
1693
1712
  });
1694
1713
  });
1714
+ __publicField(this, "keyStatusesChangeHandler", () => {
1715
+ const keyStatuses = [];
1716
+ this.session.keyStatuses.forEach((status, keyId) => {
1717
+ keyStatuses.push({
1718
+ keyId: copyKeyId(keyId),
1719
+ status
1720
+ });
1721
+ });
1722
+ this.dispatch("keyStatusesChange", { keyStatuses });
1723
+ });
1695
1724
  session.addEventListener("message", this.messageHandler);
1725
+ session.addEventListener(
1726
+ "keystatuseschange",
1727
+ this.keyStatusesChangeHandler
1728
+ );
1696
1729
  if (session.closed) {
1697
1730
  session.closed.then((reason) => {
1698
1731
  this.dispatch("closed", {
@@ -1724,6 +1757,10 @@ var StandardCommonMediaKeySession = class extends import_vinyl_util15.EventHostI
1724
1757
  super.dispose();
1725
1758
  this._disposed = true;
1726
1759
  this.session.removeEventListener("message", this.messageHandler);
1760
+ this.session.removeEventListener(
1761
+ "keystatuseschange",
1762
+ this.keyStatusesChangeHandler
1763
+ );
1727
1764
  this.session.close().catch(import_vinyl_util15.noop);
1728
1765
  }
1729
1766
  };
@@ -1835,8 +1872,21 @@ var WebKitCommonMediaKeySession = class extends import_vinyl_util16.EventHostImp
1835
1872
  this.dispatch("error", { error, target: this });
1836
1873
  }
1837
1874
  });
1875
+ // Prefixed EME reports no key ids or statuses; a key was added for the
1876
+ // session's init data.
1877
+ __publicField(this, "keyAddedHandler", () => {
1878
+ this.dispatch("keyStatusesChange", {
1879
+ keyStatuses: [
1880
+ {
1881
+ keyId: (0, import_vinyl_util16.bufferToByteArray)(this.initData).slice().buffer,
1882
+ status: "usable"
1883
+ }
1884
+ ]
1885
+ });
1886
+ });
1838
1887
  session.addEventListener("webkitkeymessage", this.messageHandler);
1839
1888
  session.addEventListener("webkitkeyerror", this.errorHandler);
1889
+ session.addEventListener("webkitkeyadded", this.keyAddedHandler);
1840
1890
  }
1841
1891
  update(key) {
1842
1892
  if (this.disposed) return Promise.reject(new import_vinyl_util16.DisposedError());
@@ -1854,6 +1904,7 @@ var WebKitCommonMediaKeySession = class extends import_vinyl_util16.EventHostImp
1854
1904
  this.messageHandler
1855
1905
  );
1856
1906
  this.session.removeEventListener("webkitkeyerror", this.errorHandler);
1907
+ this.session.removeEventListener("webkitkeyadded", this.keyAddedHandler);
1857
1908
  this.session.close();
1858
1909
  }
1859
1910
  };
@@ -1877,9 +1928,18 @@ function webkitErrorCodeToStr(code) {
1877
1928
 
1878
1929
  // src/drm/commonEme/CommonEmeFactory.ts
1879
1930
  var import_vinyl_util17 = require("@amazon/vinyl-util");
1880
- function commonEmeFactory() {
1931
+ function commonEmeFactory(options) {
1932
+ var _a, _b;
1933
+ if ((options == null ? void 0 : options.preferPrefixedMediaKeys) === true) {
1934
+ return (_a = createPrefixedCommonEme()) != null ? _a : createStandardCommonEme();
1935
+ }
1936
+ return (_b = createStandardCommonEme()) != null ? _b : createPrefixedCommonEme();
1937
+ }
1938
+ function createStandardCommonEme() {
1939
+ return supportsStandardEme() ? new StandardCommonEme() : null;
1940
+ }
1941
+ function createPrefixedCommonEme() {
1881
1942
  if (supportsWebKitEme()) return new WebKitCommonEme();
1882
- if (supportsStandardEme()) return new StandardCommonEme();
1883
1943
  if (supportsMsEme()) return new MsCommonEme();
1884
1944
  return null;
1885
1945
  }
@@ -1918,6 +1978,7 @@ var DrmKeySystem = /* @__PURE__ */ ((DrmKeySystem2) => {
1918
1978
  DrmKeySystem2["PLAY_READY_3000"] = "com.microsoft.playready.recommendation.3000";
1919
1979
  DrmKeySystem2["FAIR_PLAY"] = "com.apple.fps";
1920
1980
  DrmKeySystem2["FAIR_PLAY_1_0"] = "com.apple.fps.1_0";
1981
+ DrmKeySystem2["FAIR_PLAY_2_0"] = "com.apple.fps.2_0";
1921
1982
  return DrmKeySystem2;
1922
1983
  })(DrmKeySystem || {});
1923
1984
  var drmKeySystemValidator = /* @__PURE__ */ (0, import_vinyl_validation.string)().notEmpty();
@@ -1932,7 +1993,8 @@ function isPlayReady(keySystem) {
1932
1993
  }
1933
1994
  var FAIR_PLAY_KEY_SYSTEMS = [
1934
1995
  "com.apple.fps" /* FAIR_PLAY */,
1935
- "com.apple.fps.1_0" /* FAIR_PLAY_1_0 */
1996
+ "com.apple.fps.1_0" /* FAIR_PLAY_1_0 */,
1997
+ "com.apple.fps.2_0" /* FAIR_PLAY_2_0 */
1936
1998
  ];
1937
1999
  function isFairPlay(keySystem) {
1938
2000
  return FAIR_PLAY_KEY_SYSTEMS.includes(keySystem);
@@ -1978,7 +2040,8 @@ var drmOptionsValidator = /* @__PURE__ */ (0, import_vinyl_validation3.object)({
1978
2040
  ["org.w3.clearkey" /* CLEAR_KEY */]: /* @__PURE__ */ drmClearKeySystemOptionsValidator.optional()
1979
2041
  })
1980
2042
  ),
1981
- licenseProvider: /* @__PURE__ */ (0, import_vinyl_validation3.func)().optional()
2043
+ licenseProvider: /* @__PURE__ */ (0, import_vinyl_validation3.func)().optional(),
2044
+ preferPrefixedMediaKeys: /* @__PURE__ */ (0, import_vinyl_validation3.boolean)().maybe().optional()
1982
2045
  });
1983
2046
 
1984
2047
  // src/drm/util/unpackPlayReadyChallenge.ts
@@ -2472,10 +2535,10 @@ var DrmControllerImpl = class extends import_vinyl_util24.EventHostImpl {
2472
2535
  keySystem,
2473
2536
  drmInfo.contentType
2474
2537
  );
2475
- const capability = {
2476
- robustness: (_a = mediaOptions == null ? void 0 : mediaOptions.robustness) != null ? _a : "SW_SECURE_CRYPTO" /* SW_SECURE_CRYPTO */,
2538
+ const robustness = (_a = mediaOptions == null ? void 0 : mediaOptions.robustness) != null ? _a : defaultRobustness(keySystem);
2539
+ const capability = __spreadProps(__spreadValues({}, robustness != null && { robustness }), {
2477
2540
  encryptionScheme: drmInfo.encryptionScheme
2478
- };
2541
+ });
2479
2542
  if (drmInfo.mimeType) {
2480
2543
  capability.contentType = drmInfo.mimeType;
2481
2544
  }
@@ -2558,6 +2621,19 @@ var DrmControllerImpl = class extends import_vinyl_util24.EventHostImpl {
2558
2621
  this.closeSession(session);
2559
2622
  this.handleError(event.error);
2560
2623
  });
2624
+ session.on("keyStatusesChange", ({ keyStatuses }) => {
2625
+ if (this.disposed) return;
2626
+ (0, import_vinyl_util24.logDebug)(
2627
+ this,
2628
+ "keyStatusesChange",
2629
+ keyStatuses.map((keyStatus) => keyStatus.status)
2630
+ );
2631
+ this.dispatch("keyStatusesChange", {
2632
+ keySystem: mediaKeys.keySystem,
2633
+ keyStatuses,
2634
+ trackUri
2635
+ });
2636
+ });
2561
2637
  return session;
2562
2638
  }
2563
2639
  /**
@@ -2570,28 +2646,47 @@ var DrmControllerImpl = class extends import_vinyl_util24.EventHostImpl {
2570
2646
  this.pendingMessageProps = messageProps;
2571
2647
  const keySystem = mediaKeys.keySystem;
2572
2648
  (0, import_vinyl_util24.logDebug)(this, "message", keySystem, event.message.byteLength);
2649
+ const messageTime = Date.now();
2650
+ const keySystemOptions = (_a = this.options.keySystems[keySystem]) != null ? _a : this.options.keySystems["*"];
2651
+ const licenseServerOptionsProvider = keySystemOptions == null ? void 0 : keySystemOptions.licenseServer;
2652
+ const resolvedLicenseServerOptions = await (0, import_vinyl_util24.resolveValueProvider)(
2653
+ licenseServerOptionsProvider
2654
+ );
2655
+ let licenseServerOptions = __spreadValues({}, resolvedLicenseServerOptions);
2656
+ this.abortIfDisposed();
2657
+ if (isFairPlayCertificateRequest(keySystem, event.message)) {
2658
+ const certBytes = toCertBytes(
2659
+ licenseServerOptions.serverCertificate
2660
+ );
2661
+ if (!certBytes) {
2662
+ throw new DrmError("FairPlay requires certificate data");
2663
+ }
2664
+ this.pendingMessageProps = null;
2665
+ if (session.disposed) return;
2666
+ (0, import_vinyl_util24.logDebug)(this, "update certificate");
2667
+ await session.update(certBytes.buffer);
2668
+ return;
2669
+ }
2573
2670
  if (this.keySetupSpanStart != null) {
2574
2671
  this.dispatchLoadSpan(
2575
2672
  "keySetup",
2576
2673
  this.keySetupSpanStart,
2577
- Date.now(),
2674
+ messageTime,
2578
2675
  messageProps
2579
2676
  );
2580
2677
  this.keySetupSpanStart = null;
2581
2678
  }
2582
- const keySystemOptions = (_a = this.options.keySystems[keySystem]) != null ? _a : this.options.keySystems["*"];
2583
- const licenseServerOptionsProvider = keySystemOptions == null ? void 0 : keySystemOptions.licenseServer;
2584
- const licenseServerOptions = (_b = (0, import_vinyl_util24.clone)(await (0, import_vinyl_util24.resolveValueProvider)(licenseServerOptionsProvider))) != null ? _b : {};
2585
- this.abortIfDisposed();
2586
2679
  let challenge = event.message;
2587
2680
  if (isPlayReady(keySystem)) {
2588
2681
  const unpacked = unpackPlayReadyChallenge(challenge);
2589
2682
  challenge = unpacked.challenge;
2590
- if (licenseServerOptions.init == null)
2591
- licenseServerOptions.init = {};
2592
- licenseServerOptions.init.headers = __spreadValues(__spreadValues({}, (0, import_vinyl_util24.normalizeHeadersInit)(
2593
- (_c = licenseServerOptions.init.headers) != null ? _c : {}
2594
- )), unpacked.headers);
2683
+ licenseServerOptions = __spreadProps(__spreadValues({}, licenseServerOptions), {
2684
+ init: __spreadProps(__spreadValues({}, licenseServerOptions.init), {
2685
+ headers: __spreadValues(__spreadValues({}, (0, import_vinyl_util24.normalizeHeadersInit)(
2686
+ (_c = (_b = licenseServerOptions.init) == null ? void 0 : _b.headers) != null ? _c : {}
2687
+ )), unpacked.headers)
2688
+ })
2689
+ });
2595
2690
  }
2596
2691
  const licenseSpanStart = Date.now();
2597
2692
  const key = await this.licenseProvider(
@@ -2703,8 +2798,12 @@ function toCertBytes(serverCertificate) {
2703
2798
  if (!serverCertificate) return null;
2704
2799
  return typeof serverCertificate === "string" ? (0, import_vinyl_util24.base64ToByteArray)(serverCertificate) : (0, import_vinyl_util24.bufferToByteArray)(serverCertificate);
2705
2800
  }
2801
+ function defaultRobustness(keySystem) {
2802
+ return keySystem === "com.widevine.alpha" /* WIDEVINE */ ? "SW_SECURE_CRYPTO" /* SW_SECURE_CRYPTO */ : void 0;
2803
+ }
2706
2804
  function defaultInitDataTransformer(keySystem, certBytes) {
2707
- return (initData) => {
2805
+ return (initData, _initDataType, drmInfo) => {
2806
+ var _a;
2708
2807
  if (keySystem === "com.apple.fps.1_0" /* FAIR_PLAY_1_0 */) {
2709
2808
  if (!certBytes) {
2710
2809
  throw new DrmError("FairPlay requires certificate data");
@@ -2712,9 +2811,23 @@ function defaultInitDataTransformer(keySystem, certBytes) {
2712
2811
  const contentId = extractContentId(initData);
2713
2812
  return createFairPlaySessionInitData(initData, contentId, certBytes);
2714
2813
  }
2814
+ if (keySystem === "com.apple.fps.2_0" /* FAIR_PLAY_2_0 */) {
2815
+ const contentId = (_a = drmInfo.contentProtections.find(
2816
+ (cP) => cP.keySystem === keySystem
2817
+ )) == null ? void 0 : _a.contentId;
2818
+ if (!contentId) {
2819
+ throw new DrmError("FairPlay 2.0 requires a content id", {
2820
+ drmInfo
2821
+ });
2822
+ }
2823
+ return (0, import_vinyl_util24.byteStrToByteArray)(contentId);
2824
+ }
2715
2825
  return initData;
2716
2826
  };
2717
2827
  }
2828
+ function isFairPlayCertificateRequest(keySystem, message) {
2829
+ return keySystem === "com.apple.fps.2_0" /* FAIR_PLAY_2_0 */ && (0, import_vinyl_util24.bufferToByteStr)(message) === "certificate";
2830
+ }
2718
2831
 
2719
2832
  // src/drm/DrmKeySystemResolver.ts
2720
2833
  var import_vinyl_mpd_parser = require("@amazon/vinyl-mpd-parser");
@@ -5223,7 +5336,8 @@ var RESTRICTABLE_CONTENT_TYPES = [
5223
5336
  var drmProtectionValidator = /* @__PURE__ */ descriptorValidator.extend({
5224
5337
  keySystem: /* @__PURE__ */ (0, import_vinyl_validation10.enumOf)(DrmKeySystem),
5225
5338
  pro: /* @__PURE__ */ (0, import_vinyl_validation10.string)().maybe().optional(),
5226
- pssh: /* @__PURE__ */ (0, import_vinyl_validation10.string)().maybe().optional()
5339
+ pssh: /* @__PURE__ */ (0, import_vinyl_validation10.string)().maybe().optional(),
5340
+ contentId: /* @__PURE__ */ (0, import_vinyl_validation10.string)().maybe().optional()
5227
5341
  });
5228
5342
  var mediaFormatMetadataValidator = /* @__PURE__ */ (0, import_vinyl_validation10.object)({
5229
5343
  contentProtections: /* @__PURE__ */ (0, import_vinyl_validation10.array)(drmProtectionValidator).readonly(),
@@ -9520,6 +9634,54 @@ function buildSegmentTimeline(deps, baseUrl, segments) {
9520
9634
  // src/track/hls/buildHlsMediaTimeline.ts
9521
9635
  var import_vinyl_util94 = require("@amazon/vinyl-util");
9522
9636
  var import_vinyl_transmux = require("@amazon/vinyl-transmux");
9637
+
9638
+ // src/track/hls/util/hlsKeyDrmInfo.ts
9639
+ var import_vinyl_mpd_parser5 = require("@amazon/vinyl-mpd-parser");
9640
+ var FAIR_PLAY_KEY_FORMAT = "com.apple.streamingkeydelivery";
9641
+ var PLAY_READY_KEY_FORMAT = "com.microsoft.playready";
9642
+ function hlsKeyDrmInfo(deps, key) {
9643
+ var _a, _b;
9644
+ const encryptionScheme = methodToEncryptionScheme(key == null ? void 0 : key.method);
9645
+ if (key == null || encryptionScheme == null) return null;
9646
+ const keyFormat = (_a = key.keyFormat) == null ? void 0 : _a.toLowerCase();
9647
+ let schemeIdUri;
9648
+ let initDataType;
9649
+ let contentId = null;
9650
+ if (keyFormat === FAIR_PLAY_KEY_FORMAT) {
9651
+ schemeIdUri = import_vinyl_mpd_parser5.ContentProtectionScheme.FAIR_PLAY;
9652
+ initDataType = "sinf";
9653
+ contentId = ((_b = key.uri) == null ? void 0 : _b.replace(/^skd:\/\//i, "")) || null;
9654
+ } else if (keyFormat === PLAY_READY_KEY_FORMAT) {
9655
+ schemeIdUri = import_vinyl_mpd_parser5.ContentProtectionScheme.PLAY_READY;
9656
+ initDataType = "cenc";
9657
+ } else if (keyFormat == null ? void 0 : keyFormat.startsWith("urn:uuid:")) {
9658
+ schemeIdUri = keyFormat;
9659
+ initDataType = "cenc";
9660
+ } else {
9661
+ return null;
9662
+ }
9663
+ const keySystems = deps.drmKeySystemResolver(schemeIdUri).filter((keySystem) => keySystem !== "com.apple.fps.1_0" /* FAIR_PLAY_1_0 */);
9664
+ if (keySystems.length === 0) return null;
9665
+ return {
9666
+ contentProtections: keySystems.map((keySystem) => __spreadValues({
9667
+ keySystem
9668
+ }, contentId != null && { contentId })),
9669
+ encryptionScheme,
9670
+ initDataType
9671
+ };
9672
+ }
9673
+ function methodToEncryptionScheme(method) {
9674
+ switch (method) {
9675
+ case "SAMPLE-AES":
9676
+ return "cbcs";
9677
+ case "SAMPLE-AES-CTR":
9678
+ return "cenc";
9679
+ default:
9680
+ return null;
9681
+ }
9682
+ }
9683
+
9684
+ // src/track/hls/buildHlsMediaTimeline.ts
9523
9685
  function buildHlsMediaTimeline(deps, data3) {
9524
9686
  var _a, _b, _c, _d, _e, _f, _g, _h;
9525
9687
  const { mainPlaylist, baseUrl } = data3;
@@ -9618,7 +9780,7 @@ function createHlsQualityData(deps, data3, baseUrl, playlistUri, metadata) {
9618
9780
  return {
9619
9781
  metadata,
9620
9782
  async getSegment(time, affordance = 0) {
9621
- var _a;
9783
+ var _a, _b;
9622
9784
  const playlist = await data3.getMediaPlaylist(playlistUri);
9623
9785
  const playlistBaseUrl = getPlaylistBaseUrl(
9624
9786
  playlist,
@@ -9634,8 +9796,12 @@ function createHlsQualityData(deps, data3, baseUrl, playlistUri, metadata) {
9634
9796
  if (!segment) return null;
9635
9797
  const hlsMap = (_a = playlist.segments[0]) == null ? void 0 : _a.map;
9636
9798
  if (hlsMap) {
9799
+ const drmInfo = hlsKeyDrmInfo(
9800
+ deps,
9801
+ (_b = playlist.segments[segments.indexOf(segment)]) == null ? void 0 : _b.key
9802
+ );
9637
9803
  return __spreadProps(__spreadValues({
9638
- quality: metadata
9804
+ quality: drmInfo ? __spreadValues(__spreadValues({}, metadata), drmInfo) : metadata
9639
9805
  }, segment), {
9640
9806
  initData: createSegmentDataProvider(deps, {
9641
9807
  url: (0, import_vinyl_util94.resolveUrl)(hlsMap.uri, playlistBaseUrl),
@@ -10528,7 +10694,12 @@ function createVinylFactories(options) {
10528
10694
  trackController: (deps) => new TrackControllerImpl(deps, options.trackController),
10529
10695
  drmKeySystemResolver: () => defaultDrmKeySystemResolver,
10530
10696
  drmController: (deps) => new DrmControllerImpl(deps, options.drm),
10531
- commonEme: commonEmeFactory,
10697
+ commonEme: () => {
10698
+ var _a;
10699
+ return commonEmeFactory({
10700
+ preferPrefixedMediaKeys: (_a = options.drm) == null ? void 0 : _a.preferPrefixedMediaKeys
10701
+ });
10702
+ },
10532
10703
  autoResetController: (deps) => new AutoResetControllerImpl(deps, options.autoReset),
10533
10704
  adController: (deps) => new AdControllerImpl(deps, options.adController),
10534
10705
  createDashFactories: createDashFactories(options),
@@ -10619,7 +10790,12 @@ var VinylPlayer = class extends import_vinyl_util99.EventHostImpl {
10619
10790
  ALL_TRACK_CONTROLLER_EVENTS
10620
10791
  )
10621
10792
  );
10622
- add((0, import_vinyl_util99.redispatchEvents)(this, this.drmController, ["error"]));
10793
+ add(
10794
+ (0, import_vinyl_util99.redispatchEvents)(this, this.drmController, [
10795
+ "error",
10796
+ "keyStatusesChange"
10797
+ ])
10798
+ );
10623
10799
  add(
10624
10800
  this.drmController.on("loadSpanMeasured", (measurement) => {
10625
10801
  const trackUri = measurement.trackUri;