@svta/cml-drm 0.19.0 → 0.20.0
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/README.md +15 -0
- package/dist/index.d.ts +777 -69
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +921 -71
- package/dist/index.js.map +1 -1
- package/package.json +7 -26
- package/dist/cenc/findCencContentProtection.d.ts +0 -14
- package/dist/cenc/findCencContentProtection.d.ts.map +0 -1
- package/dist/cenc/findCencContentProtection.js +0 -30
- package/dist/cenc/findCencContentProtection.js.map +0 -1
- package/dist/cenc/getLicenseServerUrlFromContentProtection.d.ts +0 -15
- package/dist/cenc/getLicenseServerUrlFromContentProtection.d.ts.map +0 -1
- package/dist/cenc/getLicenseServerUrlFromContentProtection.js +0 -17
- package/dist/cenc/getLicenseServerUrlFromContentProtection.js.map +0 -1
- package/dist/cenc/getPsshData.d.ts +0 -13
- package/dist/cenc/getPsshData.d.ts.map +0 -1
- package/dist/cenc/getPsshData.js +0 -24
- package/dist/cenc/getPsshData.js.map +0 -1
- package/dist/cenc/getPsshForKeySystem.d.ts +0 -15
- package/dist/cenc/getPsshForKeySystem.d.ts.map +0 -1
- package/dist/cenc/getPsshForKeySystem.js +0 -22
- package/dist/cenc/getPsshForKeySystem.js.map +0 -1
- package/dist/cenc/parseInitDataFromContentProtection.d.ts +0 -18
- package/dist/cenc/parseInitDataFromContentProtection.d.ts.map +0 -1
- package/dist/cenc/parseInitDataFromContentProtection.js +0 -21
- package/dist/cenc/parseInitDataFromContentProtection.js.map +0 -1
- package/dist/cenc/parsePsshList.d.ts +0 -16
- package/dist/cenc/parsePsshList.d.ts.map +0 -1
- package/dist/cenc/parsePsshList.js +0 -87
- package/dist/cenc/parsePsshList.js.map +0 -1
- package/dist/common/CBCS.d.ts +0 -8
- package/dist/common/CBCS.d.ts.map +0 -1
- package/dist/common/CBCS.js +0 -8
- package/dist/common/CBCS.js.map +0 -1
- package/dist/common/CENC.d.ts +0 -8
- package/dist/common/CENC.d.ts.map +0 -1
- package/dist/common/CENC.js +0 -8
- package/dist/common/CENC.js.map +0 -1
- package/dist/common/CHALLENGE.d.ts +0 -8
- package/dist/common/CHALLENGE.d.ts.map +0 -1
- package/dist/common/CHALLENGE.js +0 -8
- package/dist/common/CHALLENGE.js.map +0 -1
- package/dist/common/CLEAR_KEY_SYSTEM.d.ts +0 -8
- package/dist/common/CLEAR_KEY_SYSTEM.d.ts.map +0 -1
- package/dist/common/CLEAR_KEY_SYSTEM.js +0 -8
- package/dist/common/CLEAR_KEY_SYSTEM.js.map +0 -1
- package/dist/common/CLEAR_KEY_UUID.d.ts +0 -8
- package/dist/common/CLEAR_KEY_UUID.d.ts.map +0 -1
- package/dist/common/CLEAR_KEY_UUID.js +0 -8
- package/dist/common/CLEAR_KEY_UUID.js.map +0 -1
- package/dist/common/CONTENT_TYPE.d.ts +0 -8
- package/dist/common/CONTENT_TYPE.d.ts.map +0 -1
- package/dist/common/CONTENT_TYPE.js +0 -8
- package/dist/common/CONTENT_TYPE.js.map +0 -1
- package/dist/common/ContentProtection.d.ts +0 -12
- package/dist/common/ContentProtection.d.ts.map +0 -1
- package/dist/common/ContentProtection.js +0 -2
- package/dist/common/ContentProtection.js.map +0 -1
- package/dist/common/EXPIRED.d.ts +0 -8
- package/dist/common/EXPIRED.d.ts.map +0 -1
- package/dist/common/EXPIRED.js +0 -8
- package/dist/common/EXPIRED.js.map +0 -1
- package/dist/common/EncryptionScheme.d.ts +0 -21
- package/dist/common/EncryptionScheme.d.ts.map +0 -1
- package/dist/common/EncryptionScheme.js +0 -13
- package/dist/common/EncryptionScheme.js.map +0 -1
- package/dist/common/FAIRPLAY_KEY_SYSTEM.d.ts +0 -8
- package/dist/common/FAIRPLAY_KEY_SYSTEM.d.ts.map +0 -1
- package/dist/common/FAIRPLAY_KEY_SYSTEM.js +0 -8
- package/dist/common/FAIRPLAY_KEY_SYSTEM.js.map +0 -1
- package/dist/common/FAIRPLAY_UUID.d.ts +0 -8
- package/dist/common/FAIRPLAY_UUID.d.ts.map +0 -1
- package/dist/common/FAIRPLAY_UUID.js +0 -8
- package/dist/common/FAIRPLAY_UUID.js.map +0 -1
- package/dist/common/HTTP_HEADERS.d.ts +0 -8
- package/dist/common/HTTP_HEADERS.d.ts.map +0 -1
- package/dist/common/HTTP_HEADERS.js +0 -8
- package/dist/common/HTTP_HEADERS.js.map +0 -1
- package/dist/common/HW_SECURE_ALL.d.ts +0 -8
- package/dist/common/HW_SECURE_ALL.d.ts.map +0 -1
- package/dist/common/HW_SECURE_ALL.js +0 -8
- package/dist/common/HW_SECURE_ALL.js.map +0 -1
- package/dist/common/HW_SECURE_CRYPTO.d.ts +0 -8
- package/dist/common/HW_SECURE_CRYPTO.d.ts.map +0 -1
- package/dist/common/HW_SECURE_CRYPTO.js +0 -8
- package/dist/common/HW_SECURE_CRYPTO.js.map +0 -1
- package/dist/common/HW_SECURE_DECODE.d.ts +0 -8
- package/dist/common/HW_SECURE_DECODE.d.ts.map +0 -1
- package/dist/common/HW_SECURE_DECODE.js +0 -8
- package/dist/common/HW_SECURE_DECODE.js.map +0 -1
- package/dist/common/INDIVIDUALIZATION_REQUEST.d.ts +0 -8
- package/dist/common/INDIVIDUALIZATION_REQUEST.d.ts.map +0 -1
- package/dist/common/INDIVIDUALIZATION_REQUEST.js +0 -8
- package/dist/common/INDIVIDUALIZATION_REQUEST.js.map +0 -1
- package/dist/common/INTERNAL_ERROR.d.ts +0 -8
- package/dist/common/INTERNAL_ERROR.d.ts.map +0 -1
- package/dist/common/INTERNAL_ERROR.js +0 -8
- package/dist/common/INTERNAL_ERROR.js.map +0 -1
- package/dist/common/InitializationDataType.d.ts +0 -25
- package/dist/common/InitializationDataType.d.ts.map +0 -1
- package/dist/common/InitializationDataType.js +0 -17
- package/dist/common/InitializationDataType.js.map +0 -1
- package/dist/common/KEYIDS.d.ts +0 -8
- package/dist/common/KEYIDS.d.ts.map +0 -1
- package/dist/common/KEYIDS.js +0 -8
- package/dist/common/KEYIDS.js.map +0 -1
- package/dist/common/LICENSE_ACQUISITION.d.ts +0 -8
- package/dist/common/LICENSE_ACQUISITION.d.ts.map +0 -1
- package/dist/common/LICENSE_ACQUISITION.js +0 -8
- package/dist/common/LICENSE_ACQUISITION.js.map +0 -1
- package/dist/common/LICENSE_RELEASE.d.ts +0 -8
- package/dist/common/LICENSE_RELEASE.d.ts.map +0 -1
- package/dist/common/LICENSE_RELEASE.js +0 -8
- package/dist/common/LICENSE_RELEASE.js.map +0 -1
- package/dist/common/LICENSE_RENEWAL.d.ts +0 -8
- package/dist/common/LICENSE_RENEWAL.d.ts.map +0 -1
- package/dist/common/LICENSE_RENEWAL.js +0 -8
- package/dist/common/LICENSE_RENEWAL.js.map +0 -1
- package/dist/common/LICENSE_REQUEST.d.ts +0 -8
- package/dist/common/LICENSE_REQUEST.d.ts.map +0 -1
- package/dist/common/LICENSE_REQUEST.js +0 -8
- package/dist/common/LICENSE_REQUEST.js.map +0 -1
- package/dist/common/LicenseRequest.d.ts +0 -45
- package/dist/common/LicenseRequest.d.ts.map +0 -1
- package/dist/common/LicenseRequest.js +0 -2
- package/dist/common/LicenseRequest.js.map +0 -1
- package/dist/common/MP4_PROTECTION_SCHEME.d.ts +0 -7
- package/dist/common/MP4_PROTECTION_SCHEME.d.ts.map +0 -1
- package/dist/common/MP4_PROTECTION_SCHEME.js +0 -7
- package/dist/common/MP4_PROTECTION_SCHEME.js.map +0 -1
- package/dist/common/MediaKeyMessageType.d.ts +0 -25
- package/dist/common/MediaKeyMessageType.d.ts.map +0 -1
- package/dist/common/MediaKeyMessageType.js +0 -17
- package/dist/common/MediaKeyMessageType.js.map +0 -1
- package/dist/common/MediaKeyStatus.d.ts +0 -31
- package/dist/common/MediaKeyStatus.d.ts.map +0 -1
- package/dist/common/MediaKeyStatus.js +0 -23
- package/dist/common/MediaKeyStatus.js.map +0 -1
- package/dist/common/MediaKeySystemAccessRequest.d.ts +0 -11
- package/dist/common/MediaKeySystemAccessRequest.d.ts.map +0 -1
- package/dist/common/MediaKeySystemAccessRequest.js +0 -2
- package/dist/common/MediaKeySystemAccessRequest.js.map +0 -1
- package/dist/common/OUTPUT_DOWNSCALED.d.ts +0 -8
- package/dist/common/OUTPUT_DOWNSCALED.d.ts.map +0 -1
- package/dist/common/OUTPUT_DOWNSCALED.js +0 -8
- package/dist/common/OUTPUT_DOWNSCALED.js.map +0 -1
- package/dist/common/OUTPUT_RESTRICTED.d.ts +0 -8
- package/dist/common/OUTPUT_RESTRICTED.d.ts.map +0 -1
- package/dist/common/OUTPUT_RESTRICTED.js +0 -8
- package/dist/common/OUTPUT_RESTRICTED.js.map +0 -1
- package/dist/common/PLAYREADY_KEY_MESSAGE.d.ts +0 -8
- package/dist/common/PLAYREADY_KEY_MESSAGE.d.ts.map +0 -1
- package/dist/common/PLAYREADY_KEY_MESSAGE.js +0 -8
- package/dist/common/PLAYREADY_KEY_MESSAGE.js.map +0 -1
- package/dist/common/PLAYREADY_KEY_SYSTEM.d.ts +0 -8
- package/dist/common/PLAYREADY_KEY_SYSTEM.d.ts.map +0 -1
- package/dist/common/PLAYREADY_KEY_SYSTEM.js +0 -8
- package/dist/common/PLAYREADY_KEY_SYSTEM.js.map +0 -1
- package/dist/common/PLAYREADY_RECOMMENDATION_KEY_SYSTEM.d.ts +0 -8
- package/dist/common/PLAYREADY_RECOMMENDATION_KEY_SYSTEM.d.ts.map +0 -1
- package/dist/common/PLAYREADY_RECOMMENDATION_KEY_SYSTEM.js +0 -8
- package/dist/common/PLAYREADY_RECOMMENDATION_KEY_SYSTEM.js.map +0 -1
- package/dist/common/PLAYREADY_UUID.d.ts +0 -8
- package/dist/common/PLAYREADY_UUID.d.ts.map +0 -1
- package/dist/common/PLAYREADY_UUID.js +0 -8
- package/dist/common/PLAYREADY_UUID.js.map +0 -1
- package/dist/common/RELEASED.d.ts +0 -8
- package/dist/common/RELEASED.d.ts.map +0 -1
- package/dist/common/RELEASED.js +0 -8
- package/dist/common/RELEASED.js.map +0 -1
- package/dist/common/STATUS_PENDING.d.ts +0 -8
- package/dist/common/STATUS_PENDING.d.ts.map +0 -1
- package/dist/common/STATUS_PENDING.js +0 -8
- package/dist/common/STATUS_PENDING.js.map +0 -1
- package/dist/common/SW_SECURE_CRYPTO.d.ts +0 -8
- package/dist/common/SW_SECURE_CRYPTO.d.ts.map +0 -1
- package/dist/common/SW_SECURE_CRYPTO.js +0 -8
- package/dist/common/SW_SECURE_CRYPTO.js.map +0 -1
- package/dist/common/SW_SECURE_DECODE.d.ts +0 -8
- package/dist/common/SW_SECURE_DECODE.d.ts.map +0 -1
- package/dist/common/SW_SECURE_DECODE.js +0 -8
- package/dist/common/SW_SECURE_DECODE.js.map +0 -1
- package/dist/common/TEXT_XML_UTF8.d.ts +0 -8
- package/dist/common/TEXT_XML_UTF8.d.ts.map +0 -1
- package/dist/common/TEXT_XML_UTF8.js +0 -8
- package/dist/common/TEXT_XML_UTF8.js.map +0 -1
- package/dist/common/USABLE.d.ts +0 -8
- package/dist/common/USABLE.d.ts.map +0 -1
- package/dist/common/USABLE.js +0 -8
- package/dist/common/USABLE.js.map +0 -1
- package/dist/common/W3C_CLEAR_KEY_UUID.d.ts +0 -8
- package/dist/common/W3C_CLEAR_KEY_UUID.d.ts.map +0 -1
- package/dist/common/W3C_CLEAR_KEY_UUID.js +0 -8
- package/dist/common/W3C_CLEAR_KEY_UUID.js.map +0 -1
- package/dist/common/WEBM.d.ts +0 -8
- package/dist/common/WEBM.d.ts.map +0 -1
- package/dist/common/WEBM.js +0 -8
- package/dist/common/WEBM.js.map +0 -1
- package/dist/common/WIDEVINE_KEY_SYSTEM.d.ts +0 -8
- package/dist/common/WIDEVINE_KEY_SYSTEM.d.ts.map +0 -1
- package/dist/common/WIDEVINE_KEY_SYSTEM.js +0 -8
- package/dist/common/WIDEVINE_KEY_SYSTEM.js.map +0 -1
- package/dist/common/WIDEVINE_UUID.d.ts +0 -8
- package/dist/common/WIDEVINE_UUID.d.ts.map +0 -1
- package/dist/common/WIDEVINE_UUID.js +0 -8
- package/dist/common/WIDEVINE_UUID.js.map +0 -1
- package/dist/common/WidevineRobustness.d.ts +0 -27
- package/dist/common/WidevineRobustness.d.ts.map +0 -1
- package/dist/common/WidevineRobustness.js +0 -19
- package/dist/common/WidevineRobustness.js.map +0 -1
- package/dist/fairplay/concatInitDataIdAndCertificate.d.ts +0 -15
- package/dist/fairplay/concatInitDataIdAndCertificate.d.ts.map +0 -1
- package/dist/fairplay/concatInitDataIdAndCertificate.js +0 -33
- package/dist/fairplay/concatInitDataIdAndCertificate.js.map +0 -1
- package/dist/fairplay/decodeFairPlayLicense.d.ts +0 -13
- package/dist/fairplay/decodeFairPlayLicense.d.ts.map +0 -1
- package/dist/fairplay/decodeFairPlayLicense.js +0 -18
- package/dist/fairplay/decodeFairPlayLicense.js.map +0 -1
- package/dist/fairplay/extractContentId.d.ts +0 -14
- package/dist/fairplay/extractContentId.d.ts.map +0 -1
- package/dist/fairplay/extractContentId.js +0 -19
- package/dist/fairplay/extractContentId.js.map +0 -1
- package/dist/fairplay/getId.d.ts +0 -15
- package/dist/fairplay/getId.d.ts.map +0 -1
- package/dist/fairplay/getId.js +0 -27
- package/dist/fairplay/getId.js.map +0 -1
- package/dist/fairplay/getLicenseServerUrl.d.ts +0 -13
- package/dist/fairplay/getLicenseServerUrl.d.ts.map +0 -1
- package/dist/fairplay/getLicenseServerUrl.js +0 -22
- package/dist/fairplay/getLicenseServerUrl.js.map +0 -1
- package/dist/keysystem/createMediaKeySystemConfiguration.d.ts +0 -14
- package/dist/keysystem/createMediaKeySystemConfiguration.d.ts.map +0 -1
- package/dist/keysystem/createMediaKeySystemConfiguration.js +0 -27
- package/dist/keysystem/createMediaKeySystemConfiguration.js.map +0 -1
- package/dist/keysystem/getKeySystemAccess.d.ts +0 -11
- package/dist/keysystem/getKeySystemAccess.d.ts.map +0 -1
- package/dist/keysystem/getKeySystemAccess.js +0 -20
- package/dist/keysystem/getKeySystemAccess.js.map +0 -1
- package/dist/keysystem/getLegacyKeySystemAccess.d.ts +0 -11
- package/dist/keysystem/getLegacyKeySystemAccess.d.ts.map +0 -1
- package/dist/keysystem/getLegacyKeySystemAccess.js +0 -24
- package/dist/keysystem/getLegacyKeySystemAccess.js.map +0 -1
- package/dist/keysystem/getSupportedKeySystemConfiguration.d.ts +0 -14
- package/dist/keysystem/getSupportedKeySystemConfiguration.d.ts.map +0 -1
- package/dist/keysystem/getSupportedKeySystemConfiguration.js +0 -28
- package/dist/keysystem/getSupportedKeySystemConfiguration.js.map +0 -1
- package/dist/playready/getLicenseRequestFromMessage.d.ts +0 -15
- package/dist/playready/getLicenseRequestFromMessage.d.ts.map +0 -1
- package/dist/playready/getLicenseRequestFromMessage.js +0 -41
- package/dist/playready/getLicenseRequestFromMessage.js.map +0 -1
- package/dist/playready/getRequestHeadersFromMessage.d.ts +0 -16
- package/dist/playready/getRequestHeadersFromMessage.d.ts.map +0 -1
- package/dist/playready/getRequestHeadersFromMessage.js +0 -52
- package/dist/playready/getRequestHeadersFromMessage.js.map +0 -1
- package/dist/playready/toBigEndianKeyId.d.ts +0 -13
- package/dist/playready/toBigEndianKeyId.d.ts.map +0 -1
- package/dist/playready/toBigEndianKeyId.js +0 -23
- package/dist/playready/toBigEndianKeyId.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/index.js
CHANGED
|
@@ -1,73 +1,923 @@
|
|
|
1
|
+
import { UTF_16, decodeBase64, decodeText, stringToUint16 } from "@svta/cml-utils";
|
|
2
|
+
import { getElementsByName, parseXml } from "@svta/cml-xml";
|
|
3
|
+
|
|
4
|
+
//#region src/common/CBCS.ts
|
|
1
5
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
6
|
+
* Cipher Block Chaining Sample encryption scheme.
|
|
7
|
+
*
|
|
8
|
+
*
|
|
9
|
+
* @beta
|
|
10
|
+
*/
|
|
11
|
+
const CBCS = "cbcs";
|
|
12
|
+
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/common/CENC.ts
|
|
15
|
+
/**
|
|
16
|
+
* Common Encryption scheme.
|
|
17
|
+
*
|
|
18
|
+
*
|
|
19
|
+
* @beta
|
|
20
|
+
*/
|
|
21
|
+
const CENC = "cenc";
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/common/MP4_PROTECTION_SCHEME.ts
|
|
25
|
+
/**
|
|
26
|
+
* The DASH MP4 Protection Scheme schemeIdUri.
|
|
27
|
+
*
|
|
28
|
+
* @beta
|
|
29
|
+
*/
|
|
30
|
+
const MP4_PROTECTION_SCHEME = "urn:mpeg:dash:mp4protection:2011";
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/cenc/findCencContentProtection.ts
|
|
34
|
+
/**
|
|
35
|
+
* Finds and returns the ContentProtection element for MP4 Common Encryption.
|
|
36
|
+
*
|
|
37
|
+
* @param cpArray - Array of ContentProtection elements.
|
|
38
|
+
* @returns The Common Encryption content protection element, or null if not found.
|
|
39
|
+
*
|
|
40
|
+
* @beta
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* {@includeCode ../../test/cenc/findCencContentProtection.test.ts#example}
|
|
44
|
+
*/
|
|
45
|
+
function findCencContentProtection(cpArray) {
|
|
46
|
+
if (!cpArray) return null;
|
|
47
|
+
for (const cp of cpArray) if (cp.schemeIdUri?.toLowerCase() === MP4_PROTECTION_SCHEME && cp.value && (cp.value.toLowerCase() === CENC || cp.value.toLowerCase() === CBCS)) return cp;
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/cenc/getLicenseServerUrlFromContentProtection.ts
|
|
53
|
+
/**
|
|
54
|
+
* Extracts a license server URL from an array of ContentProtection elements.
|
|
55
|
+
*
|
|
56
|
+
* @param contentProtectionElements - Array of ContentProtection nodes from the manifest.
|
|
57
|
+
* @param schemeIdUri - schemeIdUri we are searching for.
|
|
58
|
+
* @returns The license server URL, and if not found then null.
|
|
59
|
+
*
|
|
60
|
+
* @beta
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* {@includeCode ../../test/cenc/getLicenseServerUrlFromContentProtection.test.ts#example}
|
|
64
|
+
*/
|
|
65
|
+
function getLicenseServerUrlFromContentProtection(contentProtectionElements, schemeIdUri) {
|
|
66
|
+
return contentProtectionElements.find((cp) => cp.schemeIdUri === schemeIdUri)?.laUrl || null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/cenc/getPsshData.ts
|
|
71
|
+
/**
|
|
72
|
+
* Returns the data portion of a single PSSH box.
|
|
73
|
+
*
|
|
74
|
+
* @param pssh - The PSSH ArrayBuffer.
|
|
75
|
+
* @returns The data portion of the PSSH.
|
|
76
|
+
*
|
|
77
|
+
* @beta
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* {@includeCode ../../test/cenc/getPsshData.test.ts#example}
|
|
81
|
+
*/
|
|
82
|
+
function getPsshData(pssh) {
|
|
83
|
+
const offset = 8;
|
|
84
|
+
const view = new DataView(pssh);
|
|
85
|
+
const version = view.getUint8(offset);
|
|
86
|
+
let dataOffset = offset + 20;
|
|
87
|
+
if (version > 0) {
|
|
88
|
+
const kidCount = view.getUint32(dataOffset);
|
|
89
|
+
dataOffset += 4 + 16 * kidCount;
|
|
90
|
+
}
|
|
91
|
+
dataOffset += 4;
|
|
92
|
+
return pssh.slice(dataOffset);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/cenc/parsePsshList.ts
|
|
97
|
+
/**
|
|
98
|
+
* Parses a list of PSSH boxes into keysystem-specific PSSH data.
|
|
99
|
+
*
|
|
100
|
+
* @param data - The concatenated list of PSSH boxes as provided by
|
|
101
|
+
* the CDM as initialization data when CommonEncryption content is detected
|
|
102
|
+
* @returns An object that has a property named according to each of
|
|
103
|
+
* the detected key system UUIDs (e.g. 00000000-0000-0000-0000-0000000000)
|
|
104
|
+
* and a ArrayBuffer (the entire PSSH box) as the property value
|
|
105
|
+
*
|
|
106
|
+
* @beta
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* {@includeCode ../../test/cenc/parsePsshList.test.ts#example}
|
|
110
|
+
*/
|
|
111
|
+
function parsePsshList(data) {
|
|
112
|
+
if (!data) return {};
|
|
113
|
+
const dv = new DataView(data instanceof ArrayBuffer ? data : data.buffer);
|
|
114
|
+
const pssh = {};
|
|
115
|
+
let byteCursor = 0;
|
|
116
|
+
while (true) {
|
|
117
|
+
if (byteCursor >= dv.byteLength) break;
|
|
118
|
+
const boxStart = byteCursor;
|
|
119
|
+
const size = dv.getUint32(byteCursor);
|
|
120
|
+
const nextBox = byteCursor + size;
|
|
121
|
+
byteCursor += 4;
|
|
122
|
+
if (dv.getUint32(byteCursor) !== 1886614376) {
|
|
123
|
+
byteCursor = nextBox;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
byteCursor += 4;
|
|
127
|
+
const version = dv.getUint8(byteCursor);
|
|
128
|
+
if (version !== 0 && version !== 1) {
|
|
129
|
+
byteCursor = nextBox;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
byteCursor += 1;
|
|
133
|
+
byteCursor += 3;
|
|
134
|
+
let systemID = "";
|
|
135
|
+
let val;
|
|
136
|
+
for (let i = 0; i < 4; i++) {
|
|
137
|
+
val = dv.getUint8(byteCursor + i).toString(16);
|
|
138
|
+
systemID += val.length === 1 ? "0" + val : val;
|
|
139
|
+
}
|
|
140
|
+
byteCursor += 4;
|
|
141
|
+
systemID += "-";
|
|
142
|
+
for (let i = 0; i < 2; i++) {
|
|
143
|
+
val = dv.getUint8(byteCursor + i).toString(16);
|
|
144
|
+
systemID += val.length === 1 ? "0" + val : val;
|
|
145
|
+
}
|
|
146
|
+
byteCursor += 2;
|
|
147
|
+
systemID += "-";
|
|
148
|
+
for (let i = 0; i < 2; i++) {
|
|
149
|
+
val = dv.getUint8(byteCursor + i).toString(16);
|
|
150
|
+
systemID += val.length === 1 ? "0" + val : val;
|
|
151
|
+
}
|
|
152
|
+
byteCursor += 2;
|
|
153
|
+
systemID += "-";
|
|
154
|
+
for (let i = 0; i < 2; i++) {
|
|
155
|
+
val = dv.getUint8(byteCursor + i).toString(16);
|
|
156
|
+
systemID += val.length === 1 ? "0" + val : val;
|
|
157
|
+
}
|
|
158
|
+
byteCursor += 2;
|
|
159
|
+
systemID += "-";
|
|
160
|
+
for (let i = 0; i < 6; i++) {
|
|
161
|
+
val = dv.getUint8(byteCursor + i).toString(16);
|
|
162
|
+
systemID += val.length === 1 ? "0" + val : val;
|
|
163
|
+
}
|
|
164
|
+
byteCursor += 6;
|
|
165
|
+
systemID = systemID.toLowerCase();
|
|
166
|
+
byteCursor += 4;
|
|
167
|
+
pssh[systemID] = data.slice(boxStart, nextBox);
|
|
168
|
+
byteCursor = nextBox;
|
|
169
|
+
}
|
|
170
|
+
return pssh;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
//#endregion
|
|
174
|
+
//#region src/cenc/getPsshForKeySystem.ts
|
|
175
|
+
/**
|
|
176
|
+
* Returns the PSSH box associated with the given key system from the concatenated
|
|
177
|
+
* list of PSSH boxes in the provided initData.
|
|
178
|
+
*
|
|
179
|
+
* @param uuid - The desired key system UUID
|
|
180
|
+
* @param initData - 'cenc' initialization data. Concatenated list of PSSH boxes.
|
|
181
|
+
* @returns The PSSH box ArrayBuffer corresponding to the given key system, or null if not found.
|
|
182
|
+
*
|
|
183
|
+
* @beta
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* {@includeCode ../../test/cenc/getPsshForKeySystem.test.ts#example}
|
|
187
|
+
*/
|
|
188
|
+
function getPsshForKeySystem(uuid, initData) {
|
|
189
|
+
if (!initData || !uuid) return null;
|
|
190
|
+
return parsePsshList(initData)[uuid.toLowerCase()] || null;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
//#endregion
|
|
194
|
+
//#region src/cenc/parseInitDataFromContentProtection.ts
|
|
195
|
+
/**
|
|
196
|
+
* Parse a standard common encryption PSSH which contains a simple
|
|
197
|
+
* base64-encoding of the init data
|
|
198
|
+
*
|
|
199
|
+
* @param cpData - The ContentProtection element that may contain PSSH data.
|
|
200
|
+
* @param BASE64 - The BASE64 reference.
|
|
201
|
+
* @returns init data as an ArrayBuffer, or null if not found.
|
|
202
|
+
*
|
|
203
|
+
* @beta
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* {@includeCode ../../test/cenc/parseInitDataFromContentProtection.test.ts#example}
|
|
207
|
+
*/
|
|
208
|
+
function parseInitDataFromContentProtection(cpData, BASE64) {
|
|
209
|
+
if (cpData?.pssh && cpData.pssh) {
|
|
210
|
+
const cleanedText = cpData.pssh.replace(/\r?\n|\r/g, "").replace(/\s+/g, "");
|
|
211
|
+
return BASE64.decodeArray(cleanedText).buffer;
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
//#endregion
|
|
217
|
+
//#region src/keysystem/createMediaKeySystemConfiguration.ts
|
|
218
|
+
/**
|
|
219
|
+
* Creates a valid KeySystemConfiguration from supported audio and video capabilities.
|
|
220
|
+
*
|
|
221
|
+
* @param supportedAudio - supported audio capabilities.
|
|
222
|
+
* @param supportedVideo - supported video capabilities.
|
|
223
|
+
* @returns KeySystemConfiguration object.
|
|
224
|
+
*
|
|
225
|
+
* @beta
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* {@includeCode ../../test/keysystem/createMediaKeySystemConfiguration.test.ts#example}
|
|
229
|
+
*/
|
|
230
|
+
function createMediaKeySystemConfiguration(supportedAudio, supportedVideo) {
|
|
231
|
+
const config = {};
|
|
232
|
+
if (supportedAudio && supportedAudio.length > 0) config.audioCapabilities = supportedAudio;
|
|
233
|
+
if (supportedVideo && supportedVideo.length > 0) config.videoCapabilities = supportedVideo;
|
|
234
|
+
config.distinctiveIdentifier = "optional";
|
|
235
|
+
config.persistentState = "optional";
|
|
236
|
+
config.sessionTypes = ["temporary"];
|
|
237
|
+
return config;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
//#endregion
|
|
241
|
+
//#region src/keysystem/getKeySystemAccess.ts
|
|
242
|
+
/**
|
|
243
|
+
* Attempts to get key system access using requestMediaKeySystemAccess from EME.
|
|
244
|
+
*
|
|
245
|
+
* @param requests - An array of key system access requests.
|
|
246
|
+
* @returns MediaKeySystemAccess object if successful, or null if no system is supported.
|
|
247
|
+
*
|
|
248
|
+
* @beta
|
|
249
|
+
*/
|
|
250
|
+
async function getKeySystemAccess(requests) {
|
|
251
|
+
for (const { keySystem, configurations } of requests) try {
|
|
252
|
+
return await navigator.requestMediaKeySystemAccess(keySystem, configurations);
|
|
253
|
+
} catch {}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
//#endregion
|
|
258
|
+
//#region src/keysystem/getSupportedKeySystemConfiguration.ts
|
|
259
|
+
const isTypeSupported = typeof MediaKeys !== "undefined" && typeof MediaKeys.isTypeSupported === "function" ? MediaKeys.isTypeSupported : void 0;
|
|
260
|
+
/**
|
|
261
|
+
* Filters and returns the supported key system configuration for a given system string.
|
|
262
|
+
*
|
|
263
|
+
* @param keySystem - Key system string such as 'com.widevine.alpha'
|
|
264
|
+
* @param configs - An array of key system configurations.
|
|
265
|
+
* @returns The first supported configuration or null if none are supported.
|
|
266
|
+
*
|
|
267
|
+
* @beta
|
|
268
|
+
*/
|
|
269
|
+
function getSupportedKeySystemConfiguration(keySystem, configs) {
|
|
270
|
+
if (!configs || typeof isTypeSupported === "undefined") return {
|
|
271
|
+
supportedAudio: [],
|
|
272
|
+
supportedVideo: []
|
|
273
|
+
};
|
|
274
|
+
for (const config of configs) {
|
|
275
|
+
const audios = config.audioCapabilities || [];
|
|
276
|
+
const videos = config.videoCapabilities || [];
|
|
277
|
+
const supportedAudio = audios.filter((audio) => isTypeSupported(keySystem, audio.contentType ?? ""));
|
|
278
|
+
const supportedVideo = videos.filter((video) => isTypeSupported(keySystem, video.contentType ?? ""));
|
|
279
|
+
const hasAudio = supportedAudio.length > 0;
|
|
280
|
+
const hasVideo = supportedVideo.length > 0;
|
|
281
|
+
if (hasAudio || hasVideo) return {
|
|
282
|
+
supportedAudio,
|
|
283
|
+
supportedVideo
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
supportedAudio: [],
|
|
288
|
+
supportedVideo: []
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
//#endregion
|
|
293
|
+
//#region src/keysystem/getLegacyKeySystemAccess.ts
|
|
294
|
+
/**
|
|
295
|
+
* Fallback method to get key system access using legacy MediaKeys.isTypeSupported().
|
|
296
|
+
*
|
|
297
|
+
* @param requests - An array of key system access requests.
|
|
298
|
+
* @returns A KeySystemAccess object if successful, or null if no system is supported.
|
|
299
|
+
*
|
|
300
|
+
* @beta
|
|
301
|
+
*/
|
|
302
|
+
function getLegacyKeySystemAccess(requests) {
|
|
303
|
+
for (const { keySystem, configurations } of requests) {
|
|
304
|
+
const supportedConfig = getSupportedKeySystemConfiguration(keySystem, configurations);
|
|
305
|
+
if (supportedConfig) return {
|
|
306
|
+
keySystem,
|
|
307
|
+
configurations: [createMediaKeySystemConfiguration(supportedConfig.supportedAudio, supportedConfig.supportedVideo)]
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
//#endregion
|
|
314
|
+
//#region src/fairplay/concatInitDataIdAndCertificate.ts
|
|
315
|
+
/**
|
|
316
|
+
* Concatenates InitData, ID, and Certificate for FairPlay DRM.
|
|
317
|
+
*
|
|
318
|
+
* @param initData - The initialization data (PSSH box)
|
|
319
|
+
* @param id - The content ID (string or Uint16Array)
|
|
320
|
+
* @param cert - The application certificate (Uint8Array)
|
|
321
|
+
* @returns A Uint8Array containing the concatenated data
|
|
322
|
+
*
|
|
323
|
+
* @beta
|
|
324
|
+
*
|
|
325
|
+
* @example
|
|
326
|
+
* {@includeCode ../../test/fairplay/concatInitDataIdAndCertificate.test.ts#example}
|
|
327
|
+
*/
|
|
328
|
+
function concatInitDataIdAndCertificate(initData, id, cert) {
|
|
329
|
+
if (typeof id === "string") id = stringToUint16(id);
|
|
330
|
+
const buffer = new ArrayBuffer(initData.byteLength + 4 + id.byteLength + 4 + cert.byteLength);
|
|
331
|
+
const dataView = new DataView(buffer);
|
|
332
|
+
let offset = 0;
|
|
333
|
+
new Uint8Array(buffer, offset, initData.byteLength).set(initData);
|
|
334
|
+
offset += initData.byteLength;
|
|
335
|
+
dataView.setUint32(offset, id.byteLength, true);
|
|
336
|
+
offset += 4;
|
|
337
|
+
new Uint16Array(buffer, offset, id.length).set(id);
|
|
338
|
+
offset += id.byteLength;
|
|
339
|
+
dataView.setUint32(offset, cert.byteLength, true);
|
|
340
|
+
offset += 4;
|
|
341
|
+
new Uint8Array(buffer, offset, cert.byteLength).set(cert);
|
|
342
|
+
return new Uint8Array(buffer);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
//#endregion
|
|
346
|
+
//#region src/fairplay/decodeFairPlayLicense.ts
|
|
347
|
+
/**
|
|
348
|
+
* Decodes a FairPlay DRM license response.
|
|
349
|
+
*
|
|
350
|
+
* @param response - The license response, either a base64 string or ArrayBuffer
|
|
351
|
+
* @returns A Uint8Array containing the decoded license
|
|
352
|
+
*
|
|
353
|
+
* @beta
|
|
354
|
+
*
|
|
355
|
+
* @example
|
|
356
|
+
* {@includeCode ../../test/fairplay/decodeFairPlayLicense.test.ts#example}
|
|
357
|
+
*/
|
|
358
|
+
function decodeFairPlayLicense(response) {
|
|
359
|
+
return typeof response === "string" ? decodeBase64(response) : new Uint8Array(response);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
//#endregion
|
|
363
|
+
//#region src/fairplay/extractContentId.ts
|
|
364
|
+
/**
|
|
365
|
+
* Extracts the content ID from InitData using skd:// URI or query parameters.
|
|
366
|
+
*
|
|
367
|
+
* @param initData - The initialization data (PSSH box)
|
|
368
|
+
* @returns The extracted content ID
|
|
369
|
+
*
|
|
370
|
+
* @beta
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* {@includeCode ../../test/fairplay/extractContentId.test.ts#example}
|
|
374
|
+
*/
|
|
375
|
+
function extractContentId(initData, encoding = UTF_16) {
|
|
376
|
+
return decodeText(initData, { encoding }).split("skd://")[1] || "";
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
//#endregion
|
|
380
|
+
//#region src/fairplay/getId.ts
|
|
381
|
+
/**
|
|
382
|
+
* Extracts the content ID from the license server URL or InitData.
|
|
383
|
+
*
|
|
384
|
+
* @param licenseServerUrl - The license server URL
|
|
385
|
+
* @param initData - The initialization data (PSSH box)
|
|
386
|
+
* @param queryParam - The query parameter key to extract (default: 'ContentId')
|
|
387
|
+
* @returns The extracted content ID as a string or null if not found
|
|
388
|
+
*
|
|
389
|
+
* @beta
|
|
390
|
+
*
|
|
391
|
+
* @example
|
|
392
|
+
* {@includeCode ../../test/fairplay/getId.test.ts#example}
|
|
393
|
+
*/
|
|
394
|
+
function getId(licenseServerUrl, initData, queryParam = "ContentId") {
|
|
395
|
+
try {
|
|
396
|
+
const url = new URL(licenseServerUrl);
|
|
397
|
+
return new URLSearchParams(url.search).get(queryParam) || extractContentId(initData);
|
|
398
|
+
} catch {
|
|
399
|
+
return extractContentId(initData);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
//#endregion
|
|
404
|
+
//#region src/fairplay/getLicenseServerUrl.ts
|
|
405
|
+
/**
|
|
406
|
+
* Retrieves the FairPlay license server URL from InitData.
|
|
407
|
+
*
|
|
408
|
+
* @param initData - The initialization data (PSSH box)
|
|
409
|
+
* @returns The license server URL as a string
|
|
410
|
+
*
|
|
411
|
+
* @beta
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
* {@includeCode ../../test/fairplay/getLicenseServerUrl.test.ts#example}
|
|
415
|
+
*/
|
|
416
|
+
function getLicenseServerUrl(initData) {
|
|
417
|
+
let initDataString = "";
|
|
418
|
+
for (let i = 0; i < initData.length; i++) if (initData[i] !== 0) initDataString += String.fromCharCode(initData[i]);
|
|
419
|
+
const match = initDataString.match(/skd:\/\/([^"\s]+)/);
|
|
420
|
+
return match ? `https://${match[1]}` : "";
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
//#endregion
|
|
424
|
+
//#region src/common/CHALLENGE.ts
|
|
425
|
+
/**
|
|
426
|
+
* License Challenge.
|
|
427
|
+
*
|
|
428
|
+
*
|
|
429
|
+
* @beta
|
|
430
|
+
*/
|
|
431
|
+
const CHALLENGE = "Challenge";
|
|
432
|
+
|
|
433
|
+
//#endregion
|
|
434
|
+
//#region src/common/PLAYREADY_KEY_MESSAGE.ts
|
|
435
|
+
/**
|
|
436
|
+
* Playready Key Message.
|
|
437
|
+
*
|
|
438
|
+
*
|
|
439
|
+
* @beta
|
|
440
|
+
*/
|
|
441
|
+
const PLAYREADY_KEY_MESSAGE = "PlayReadyKeyMessage";
|
|
442
|
+
|
|
443
|
+
//#endregion
|
|
444
|
+
//#region src/playready/getLicenseRequestFromMessage.ts
|
|
445
|
+
/**
|
|
446
|
+
* Gets the PlayReady license request from the MediaKeyMessageEvent.
|
|
447
|
+
*
|
|
448
|
+
* @param message - An ArrayBuffer from the content decryption module.
|
|
449
|
+
* @param encoding - The message encoding type. Default is UTF-16.
|
|
450
|
+
* @returns The license request as an ArrayBuffer.
|
|
451
|
+
*
|
|
452
|
+
* @beta
|
|
453
|
+
*
|
|
454
|
+
* @example
|
|
455
|
+
* {@includeCode ../../test/playready/getLicenseRequestFromMessage.test.ts#example}
|
|
456
|
+
*/
|
|
457
|
+
function getLicenseRequestFromMessage(message, encoding = UTF_16) {
|
|
458
|
+
if (encoding === UTF_16 && message?.byteLength % 2 === 1) return message;
|
|
459
|
+
const playReadyKeyMessage = getElementsByName(parseXml(decodeText(message, { encoding })), PLAYREADY_KEY_MESSAGE)[0];
|
|
460
|
+
if (!playReadyKeyMessage) return message;
|
|
461
|
+
const challengeValue = getElementsByName(playReadyKeyMessage, CHALLENGE)[0]?.childNodes[0]?.nodeValue;
|
|
462
|
+
if (challengeValue) return decodeBase64(challengeValue).buffer;
|
|
463
|
+
return message;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
//#endregion
|
|
467
|
+
//#region src/common/CONTENT_TYPE.ts
|
|
468
|
+
/**
|
|
469
|
+
* Content-Type header.
|
|
470
|
+
*
|
|
471
|
+
*
|
|
472
|
+
* @beta
|
|
473
|
+
*/
|
|
474
|
+
const CONTENT_TYPE = "Content-Type";
|
|
475
|
+
|
|
476
|
+
//#endregion
|
|
477
|
+
//#region src/common/HTTP_HEADERS.ts
|
|
478
|
+
/**
|
|
479
|
+
* Playready HTTP Headers.
|
|
480
|
+
*
|
|
481
|
+
*
|
|
482
|
+
* @beta
|
|
483
|
+
*/
|
|
484
|
+
const HTTP_HEADERS = "HttpHeaders";
|
|
485
|
+
|
|
486
|
+
//#endregion
|
|
487
|
+
//#region src/common/TEXT_XML_UTF8.ts
|
|
488
|
+
/**
|
|
489
|
+
* XML formatted, UTF-8 encoded, text header.
|
|
490
|
+
*
|
|
491
|
+
*
|
|
492
|
+
* @beta
|
|
493
|
+
*/
|
|
494
|
+
const TEXT_XML_UTF8 = "text/xml; charset=utf-8";
|
|
495
|
+
|
|
496
|
+
//#endregion
|
|
497
|
+
//#region src/playready/getRequestHeadersFromMessage.ts
|
|
498
|
+
/**
|
|
499
|
+
* Gets the PlayReady license request headers from the MediaKeyMessageEvent.
|
|
500
|
+
*
|
|
501
|
+
* @param message - An ArrayBuffer from the content decryption module.
|
|
502
|
+
* @param encoding - The message encoding type. Default is UTF-16.
|
|
503
|
+
* @returns Request headers.
|
|
504
|
+
*
|
|
505
|
+
* @beta
|
|
506
|
+
*
|
|
507
|
+
* @example
|
|
508
|
+
* {@includeCode ../../test/playready/getRequestHeadersFromMessage.test.ts#example}
|
|
509
|
+
*/
|
|
510
|
+
function getRequestHeadersFromMessage(message, encoding = UTF_16) {
|
|
511
|
+
const headers = {};
|
|
512
|
+
if (encoding === UTF_16 && message && message.byteLength % 2 === 1) {
|
|
513
|
+
headers[CONTENT_TYPE] = TEXT_XML_UTF8;
|
|
514
|
+
return headers;
|
|
515
|
+
}
|
|
516
|
+
const httpHeaders = getElementsByName(parseXml(decodeText(message, { encoding })), HTTP_HEADERS)[0]?.childNodes;
|
|
517
|
+
if (!httpHeaders) return headers;
|
|
518
|
+
for (const header of httpHeaders) {
|
|
519
|
+
const name = getElementsByName(header, "name")[0]?.childNodes[0]?.nodeValue;
|
|
520
|
+
const value = getElementsByName(header, "value")[0]?.childNodes[0]?.nodeValue;
|
|
521
|
+
if (name && value) headers[name] = value;
|
|
522
|
+
}
|
|
523
|
+
if (headers.hasOwnProperty("Content")) {
|
|
524
|
+
headers[CONTENT_TYPE] = headers["Content"];
|
|
525
|
+
delete headers["Content"];
|
|
526
|
+
}
|
|
527
|
+
if (!headers.hasOwnProperty(CONTENT_TYPE)) headers[CONTENT_TYPE] = TEXT_XML_UTF8;
|
|
528
|
+
return headers;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
//#endregion
|
|
532
|
+
//#region src/playready/toBigEndianKeyId.ts
|
|
533
|
+
/**
|
|
534
|
+
* Converts a 16-byte key ID from little-endian to big-endian format.
|
|
535
|
+
*
|
|
536
|
+
* @param keyId - The little-endian key ID to convert.
|
|
537
|
+
* @returns The big-endian representation of the key ID.
|
|
538
|
+
*
|
|
539
|
+
* @beta
|
|
540
|
+
*
|
|
541
|
+
* @example
|
|
542
|
+
* {@includeCode ../../test/playready/toBigEndianKeyId.test.ts#example}
|
|
543
|
+
*/
|
|
544
|
+
function toBigEndianKeyId(keyId) {
|
|
545
|
+
if (keyId.byteLength !== 16) return keyId;
|
|
546
|
+
const buffer = keyId.slice(0);
|
|
547
|
+
const dataView = new DataView(buffer);
|
|
548
|
+
dataView.setUint32(0, dataView.getUint32(0, true), false);
|
|
549
|
+
dataView.setUint16(4, dataView.getUint16(4, true), false);
|
|
550
|
+
dataView.setUint16(6, dataView.getUint16(6, true), false);
|
|
551
|
+
return buffer;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
//#endregion
|
|
555
|
+
//#region src/common/CLEAR_KEY_SYSTEM.ts
|
|
556
|
+
/**
|
|
557
|
+
* Clear Key System.
|
|
558
|
+
*
|
|
559
|
+
*
|
|
560
|
+
* @beta
|
|
561
|
+
*/
|
|
562
|
+
const CLEAR_KEY_SYSTEM = "org.w3.clearkey";
|
|
563
|
+
|
|
564
|
+
//#endregion
|
|
565
|
+
//#region src/common/CLEAR_KEY_UUID.ts
|
|
566
|
+
/**
|
|
567
|
+
* Clear Key UUID.
|
|
568
|
+
*
|
|
569
|
+
*
|
|
570
|
+
* @beta
|
|
571
|
+
*/
|
|
572
|
+
const CLEAR_KEY_UUID = "e2719d58-a985-b3c9-781a-b030af78d30e";
|
|
573
|
+
|
|
574
|
+
//#endregion
|
|
575
|
+
//#region src/common/EncryptionScheme.ts
|
|
576
|
+
/**
|
|
577
|
+
* Encryption schemes.
|
|
578
|
+
*
|
|
579
|
+
*
|
|
580
|
+
* @beta
|
|
581
|
+
*/
|
|
582
|
+
const EncryptionScheme = {
|
|
583
|
+
CENC,
|
|
584
|
+
CBCS
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
//#endregion
|
|
588
|
+
//#region src/common/EXPIRED.ts
|
|
589
|
+
/**
|
|
590
|
+
* Expired Media Key Status.
|
|
591
|
+
*
|
|
592
|
+
*
|
|
593
|
+
* @beta
|
|
594
|
+
*/
|
|
595
|
+
const EXPIRED = "expired";
|
|
596
|
+
|
|
597
|
+
//#endregion
|
|
598
|
+
//#region src/common/FAIRPLAY_KEY_SYSTEM.ts
|
|
599
|
+
/**
|
|
600
|
+
* FairPlay Key System.
|
|
601
|
+
*
|
|
602
|
+
*
|
|
603
|
+
* @beta
|
|
604
|
+
*/
|
|
605
|
+
const FAIRPLAY_KEY_SYSTEM = "com.apple.fps.1_0";
|
|
606
|
+
|
|
607
|
+
//#endregion
|
|
608
|
+
//#region src/common/FAIRPLAY_UUID.ts
|
|
609
|
+
/**
|
|
610
|
+
* FairPlay UUID.
|
|
611
|
+
*
|
|
612
|
+
*
|
|
613
|
+
* @beta
|
|
614
|
+
*/
|
|
615
|
+
const FAIRPLAY_UUID = "29701fe4-3cc7-4a34-8c5b-ae90c7439a47";
|
|
616
|
+
|
|
617
|
+
//#endregion
|
|
618
|
+
//#region src/common/HW_SECURE_ALL.ts
|
|
619
|
+
/**
|
|
620
|
+
* Hardware Secure All Robustness.
|
|
621
|
+
*
|
|
622
|
+
*
|
|
623
|
+
* @beta
|
|
624
|
+
*/
|
|
625
|
+
const HW_SECURE_ALL = "HW_SECURE_ALL";
|
|
626
|
+
|
|
627
|
+
//#endregion
|
|
628
|
+
//#region src/common/HW_SECURE_CRYPTO.ts
|
|
629
|
+
/**
|
|
630
|
+
* Hardware Secure Crypto Robustness.
|
|
631
|
+
*
|
|
632
|
+
*
|
|
633
|
+
* @beta
|
|
634
|
+
*/
|
|
635
|
+
const HW_SECURE_CRYPTO = "HW_SECURE_CRYPTO";
|
|
636
|
+
|
|
637
|
+
//#endregion
|
|
638
|
+
//#region src/common/HW_SECURE_DECODE.ts
|
|
639
|
+
/**
|
|
640
|
+
* Hardware Secure Decode Robustness.
|
|
641
|
+
*
|
|
642
|
+
*
|
|
643
|
+
* @beta
|
|
644
|
+
*/
|
|
645
|
+
const HW_SECURE_DECODE = "HW_SECURE_DECODE";
|
|
646
|
+
|
|
647
|
+
//#endregion
|
|
648
|
+
//#region src/common/INDIVIDUALIZATION_REQUEST.ts
|
|
649
|
+
/**
|
|
650
|
+
* Individualization Request.
|
|
651
|
+
*
|
|
652
|
+
*
|
|
653
|
+
* @beta
|
|
654
|
+
*/
|
|
655
|
+
const INDIVIDUALIZATION_REQUEST = "individualization-request";
|
|
656
|
+
|
|
657
|
+
//#endregion
|
|
658
|
+
//#region src/common/KEYIDS.ts
|
|
659
|
+
/**
|
|
660
|
+
* Key IDs.
|
|
661
|
+
*
|
|
662
|
+
*
|
|
663
|
+
* @beta
|
|
664
|
+
*/
|
|
665
|
+
const KEYIDS = "keyids";
|
|
666
|
+
|
|
667
|
+
//#endregion
|
|
668
|
+
//#region src/common/WEBM.ts
|
|
669
|
+
/**
|
|
670
|
+
* WEBM.
|
|
671
|
+
*
|
|
672
|
+
*
|
|
673
|
+
* @beta
|
|
674
|
+
*/
|
|
675
|
+
const WEBM = "webm";
|
|
676
|
+
|
|
677
|
+
//#endregion
|
|
678
|
+
//#region src/common/InitializationDataType.ts
|
|
679
|
+
/**
|
|
680
|
+
* Initialization Data Type.
|
|
681
|
+
*
|
|
682
|
+
*
|
|
683
|
+
* @beta
|
|
684
|
+
*/
|
|
685
|
+
const InitializationDataType = {
|
|
686
|
+
CENC,
|
|
687
|
+
CBCS,
|
|
688
|
+
KEYIDS,
|
|
689
|
+
WEBM
|
|
690
|
+
};
|
|
691
|
+
|
|
692
|
+
//#endregion
|
|
693
|
+
//#region src/common/INTERNAL_ERROR.ts
|
|
694
|
+
/**
|
|
695
|
+
* Internal Error Media Key Status.
|
|
696
|
+
*
|
|
697
|
+
*
|
|
698
|
+
* @beta
|
|
699
|
+
*/
|
|
700
|
+
const INTERNAL_ERROR = "internal-error";
|
|
701
|
+
|
|
702
|
+
//#endregion
|
|
703
|
+
//#region src/common/LICENSE_ACQUISITION.ts
|
|
704
|
+
/**
|
|
705
|
+
* License Acquisition.
|
|
706
|
+
*
|
|
707
|
+
*
|
|
708
|
+
* @beta
|
|
709
|
+
*/
|
|
710
|
+
const LICENSE_ACQUISITION = "LicenseAcquisition";
|
|
711
|
+
|
|
712
|
+
//#endregion
|
|
713
|
+
//#region src/common/LICENSE_RELEASE.ts
|
|
714
|
+
/**
|
|
715
|
+
* License Release.
|
|
716
|
+
*
|
|
717
|
+
*
|
|
718
|
+
* @beta
|
|
719
|
+
*/
|
|
720
|
+
const LICENSE_RELEASE = "license-release";
|
|
721
|
+
|
|
722
|
+
//#endregion
|
|
723
|
+
//#region src/common/LICENSE_RENEWAL.ts
|
|
724
|
+
/**
|
|
725
|
+
* License Renewal.
|
|
726
|
+
*
|
|
727
|
+
*
|
|
728
|
+
* @beta
|
|
729
|
+
*/
|
|
730
|
+
const LICENSE_RENEWAL = "license-renewal";
|
|
731
|
+
|
|
732
|
+
//#endregion
|
|
733
|
+
//#region src/common/LICENSE_REQUEST.ts
|
|
734
|
+
/**
|
|
735
|
+
* License Request.
|
|
736
|
+
*
|
|
737
|
+
*
|
|
738
|
+
* @beta
|
|
739
|
+
*/
|
|
740
|
+
const LICENSE_REQUEST = "license-request";
|
|
741
|
+
|
|
742
|
+
//#endregion
|
|
743
|
+
//#region src/common/MediaKeyMessageType.ts
|
|
744
|
+
/**
|
|
745
|
+
* Media Key Message Types.
|
|
746
|
+
*
|
|
747
|
+
*
|
|
748
|
+
* @beta
|
|
749
|
+
*/
|
|
750
|
+
const MediaKeyMessageType = {
|
|
751
|
+
LICENSE_REQUEST,
|
|
752
|
+
LICENSE_RENEWAL,
|
|
753
|
+
LICENSE_RELEASE,
|
|
754
|
+
INDIVIDUALIZATION_REQUEST
|
|
755
|
+
};
|
|
756
|
+
|
|
757
|
+
//#endregion
|
|
758
|
+
//#region src/common/OUTPUT_DOWNSCALED.ts
|
|
759
|
+
/**
|
|
760
|
+
* Output Downscaled Media Key Status.
|
|
761
|
+
*
|
|
762
|
+
*
|
|
763
|
+
* @beta
|
|
764
|
+
*/
|
|
765
|
+
const OUTPUT_DOWNSCALED = "output-downscaled";
|
|
766
|
+
|
|
767
|
+
//#endregion
|
|
768
|
+
//#region src/common/OUTPUT_RESTRICTED.ts
|
|
769
|
+
/**
|
|
770
|
+
* Output Restricted Media Key Status.
|
|
771
|
+
*
|
|
772
|
+
*
|
|
773
|
+
* @beta
|
|
774
|
+
*/
|
|
775
|
+
const OUTPUT_RESTRICTED = "output-restricted";
|
|
776
|
+
|
|
777
|
+
//#endregion
|
|
778
|
+
//#region src/common/RELEASED.ts
|
|
779
|
+
/**
|
|
780
|
+
* Released Media Key Status.
|
|
781
|
+
*
|
|
782
|
+
*
|
|
783
|
+
* @beta
|
|
784
|
+
*/
|
|
785
|
+
const RELEASED = "released";
|
|
786
|
+
|
|
787
|
+
//#endregion
|
|
788
|
+
//#region src/common/STATUS_PENDING.ts
|
|
789
|
+
/**
|
|
790
|
+
* Status Pending Media Key Status.
|
|
791
|
+
*
|
|
792
|
+
*
|
|
793
|
+
* @beta
|
|
794
|
+
*/
|
|
795
|
+
const STATUS_PENDING = "status-pending";
|
|
796
|
+
|
|
797
|
+
//#endregion
|
|
798
|
+
//#region src/common/USABLE.ts
|
|
799
|
+
/**
|
|
800
|
+
* Usable Media Key Status.
|
|
801
|
+
*
|
|
802
|
+
*
|
|
803
|
+
* @beta
|
|
804
|
+
*/
|
|
805
|
+
const USABLE = "usable";
|
|
806
|
+
|
|
807
|
+
//#endregion
|
|
808
|
+
//#region src/common/MediaKeyStatus.ts
|
|
809
|
+
/**
|
|
810
|
+
* Media Key Statuses.
|
|
811
|
+
*
|
|
812
|
+
*
|
|
813
|
+
* @beta
|
|
814
|
+
*/
|
|
815
|
+
const MediaKeyStatus = {
|
|
816
|
+
USABLE,
|
|
817
|
+
EXPIRED,
|
|
818
|
+
RELEASED,
|
|
819
|
+
OUTPUT_RESTRICTED,
|
|
820
|
+
OUTPUT_DOWNSCALED,
|
|
821
|
+
STATUS_PENDING,
|
|
822
|
+
INTERNAL_ERROR
|
|
823
|
+
};
|
|
824
|
+
|
|
825
|
+
//#endregion
|
|
826
|
+
//#region src/common/PLAYREADY_KEY_SYSTEM.ts
|
|
827
|
+
/**
|
|
828
|
+
* Playready Key System.
|
|
829
|
+
*
|
|
830
|
+
*
|
|
831
|
+
* @beta
|
|
832
|
+
*/
|
|
833
|
+
const PLAYREADY_KEY_SYSTEM = "com.microsoft.playready";
|
|
834
|
+
|
|
835
|
+
//#endregion
|
|
836
|
+
//#region src/common/PLAYREADY_RECOMMENDATION_KEY_SYSTEM.ts
|
|
837
|
+
/**
|
|
838
|
+
* Playready Recommendation Key System.
|
|
839
|
+
*
|
|
840
|
+
*
|
|
841
|
+
* @beta
|
|
842
|
+
*/
|
|
843
|
+
const PLAYREADY_RECOMMENDATION_KEY_SYSTEM = "com.microsoft.playready.recommendation";
|
|
844
|
+
|
|
845
|
+
//#endregion
|
|
846
|
+
//#region src/common/PLAYREADY_UUID.ts
|
|
847
|
+
/**
|
|
848
|
+
* Playready UUID.
|
|
849
|
+
*
|
|
850
|
+
*
|
|
851
|
+
* @beta
|
|
852
|
+
*/
|
|
853
|
+
const PLAYREADY_UUID = "9a04f079-9840-4286-ab92-e65be0885f95";
|
|
854
|
+
|
|
855
|
+
//#endregion
|
|
856
|
+
//#region src/common/SW_SECURE_CRYPTO.ts
|
|
857
|
+
/**
|
|
858
|
+
* Software Secure Crypto Robustness.
|
|
859
|
+
*
|
|
860
|
+
*
|
|
861
|
+
* @beta
|
|
862
|
+
*/
|
|
863
|
+
const SW_SECURE_CRYPTO = "SW_SECURE_CRYPTO";
|
|
864
|
+
|
|
865
|
+
//#endregion
|
|
866
|
+
//#region src/common/SW_SECURE_DECODE.ts
|
|
867
|
+
/**
|
|
868
|
+
* Software Secure Decode Robustness.
|
|
869
|
+
*
|
|
870
|
+
*
|
|
871
|
+
* @beta
|
|
872
|
+
*/
|
|
873
|
+
const SW_SECURE_DECODE = "SW_SECURE_DECODE";
|
|
874
|
+
|
|
875
|
+
//#endregion
|
|
876
|
+
//#region src/common/W3C_CLEAR_KEY_UUID.ts
|
|
877
|
+
/**
|
|
878
|
+
* W3C Clear Key UUID.
|
|
879
|
+
*
|
|
880
|
+
*
|
|
881
|
+
* @beta
|
|
882
|
+
*/
|
|
883
|
+
const W3C_CLEAR_KEY_UUID = "1077efec-c0b2-4d02-ace3-3c1e52e2fb4b";
|
|
884
|
+
|
|
885
|
+
//#endregion
|
|
886
|
+
//#region src/common/WIDEVINE_KEY_SYSTEM.ts
|
|
887
|
+
/**
|
|
888
|
+
* Widevine Key System.
|
|
889
|
+
*
|
|
890
|
+
*
|
|
891
|
+
* @beta
|
|
892
|
+
*/
|
|
893
|
+
const WIDEVINE_KEY_SYSTEM = "com.widevine.alpha";
|
|
894
|
+
|
|
895
|
+
//#endregion
|
|
896
|
+
//#region src/common/WIDEVINE_UUID.ts
|
|
897
|
+
/**
|
|
898
|
+
* Widevine UUID.
|
|
899
|
+
*
|
|
900
|
+
*
|
|
901
|
+
* @beta
|
|
902
|
+
*/
|
|
903
|
+
const WIDEVINE_UUID = "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed";
|
|
904
|
+
|
|
905
|
+
//#endregion
|
|
906
|
+
//#region src/common/WidevineRobustness.ts
|
|
907
|
+
/**
|
|
908
|
+
* Widevine Robustness.
|
|
909
|
+
*
|
|
910
|
+
*
|
|
911
|
+
* @beta
|
|
912
|
+
*/
|
|
913
|
+
const WidevineRobustness = {
|
|
914
|
+
SW_SECURE_CRYPTO,
|
|
915
|
+
SW_SECURE_DECODE,
|
|
916
|
+
HW_SECURE_CRYPTO,
|
|
917
|
+
HW_SECURE_DECODE,
|
|
918
|
+
HW_SECURE_ALL
|
|
919
|
+
};
|
|
920
|
+
|
|
921
|
+
//#endregion
|
|
922
|
+
export { CBCS, CENC, CHALLENGE, CLEAR_KEY_SYSTEM, CLEAR_KEY_UUID, CONTENT_TYPE, EXPIRED, EncryptionScheme, FAIRPLAY_KEY_SYSTEM, FAIRPLAY_UUID, HTTP_HEADERS, HW_SECURE_ALL, HW_SECURE_CRYPTO, HW_SECURE_DECODE, INDIVIDUALIZATION_REQUEST, INTERNAL_ERROR, InitializationDataType, KEYIDS, LICENSE_ACQUISITION, LICENSE_RELEASE, LICENSE_RENEWAL, LICENSE_REQUEST, MP4_PROTECTION_SCHEME, MediaKeyMessageType, MediaKeyStatus, OUTPUT_DOWNSCALED, OUTPUT_RESTRICTED, PLAYREADY_KEY_MESSAGE, PLAYREADY_KEY_SYSTEM, PLAYREADY_RECOMMENDATION_KEY_SYSTEM, PLAYREADY_UUID, RELEASED, STATUS_PENDING, SW_SECURE_CRYPTO, SW_SECURE_DECODE, TEXT_XML_UTF8, USABLE, W3C_CLEAR_KEY_UUID, WEBM, WIDEVINE_KEY_SYSTEM, WIDEVINE_UUID, WidevineRobustness, concatInitDataIdAndCertificate, createMediaKeySystemConfiguration, decodeFairPlayLicense, extractContentId, findCencContentProtection, getId, getKeySystemAccess, getLegacyKeySystemAccess, getLicenseRequestFromMessage, getLicenseServerUrl, getLicenseServerUrlFromContentProtection, getPsshData, getPsshForKeySystem, getRequestHeadersFromMessage, getSupportedKeySystemConfiguration, parseInitDataFromContentProtection, parsePsshList, toBigEndianKeyId };
|
|
73
923
|
//# sourceMappingURL=index.js.map
|