1e41f4b71Sopenharmony_ci# DRM Media Key Session Management (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ciThe **MediaKeySystem** class of the DRM module supports media key management and media decryption. **MediaKeySession** instances are created and destroyed by **MediaKeySystem** instances.
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci## How to Develop
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ciRead [DRM](../../reference/apis-drm-kit/js-apis-drm.md) for the API reference.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci1. Import the module.
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci   ```ts
12e41f4b71Sopenharmony_ci   import { drm } from '@kit.DrmKit';
13e41f4b71Sopenharmony_ci   ```
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci2. Import the **BusinessError** module, which provides the error codes thrown by the APIs of the DRM module.
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci   ```ts
18e41f4b71Sopenharmony_ci   import { BusinessError } from '@kit.BasicServicesKit';
19e41f4b71Sopenharmony_ci   ```
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci3. Listen for the session status.
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci    You can listen for the following events of a **MediaKeySession** instance: key request events, key expiry events, vendor-defined events, key update on expiry events, and key change events.
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci    - Listen for key request events, which are triggered when a media key is requested.
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci       ```ts
28e41f4b71Sopenharmony_ci       mediaKeySession.on('keyRequired', (eventInfo: drm.EventInfo) => {
29e41f4b71Sopenharmony_ci         console.log('keyRequired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo);
30e41f4b71Sopenharmony_ci       });
31e41f4b71Sopenharmony_ci       ```
32e41f4b71Sopenharmony_ci
33e41f4b71Sopenharmony_ci    - Listen for key expiry events, which are triggered when a media key expires.
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci       ```ts
36e41f4b71Sopenharmony_ci       mediaKeySession.on('keyExpired', (eventInfo: drm.EventInfo) => {
37e41f4b71Sopenharmony_ci          console.log('keyExpired' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo);
38e41f4b71Sopenharmony_ci       });
39e41f4b71Sopenharmony_ci       ```
40e41f4b71Sopenharmony_ci
41e41f4b71Sopenharmony_ci    - Listen for vendor-defined events, which are triggered when a custom event of the DRM scheme occurs.
42e41f4b71Sopenharmony_ci
43e41f4b71Sopenharmony_ci       ```ts
44e41f4b71Sopenharmony_ci       mediaKeySession.on('vendorDefined', (eventInfo: drm.EventInfo) => {
45e41f4b71Sopenharmony_ci         console.log('vendorDefined' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo);
46e41f4b71Sopenharmony_ci       });
47e41f4b71Sopenharmony_ci       ```
48e41f4b71Sopenharmony_ci
49e41f4b71Sopenharmony_ci    - Listen for key update on expiry events, which are triggered when a media key updates upon expiry.
50e41f4b71Sopenharmony_ci
51e41f4b71Sopenharmony_ci       ```ts
52e41f4b71Sopenharmony_ci       mediaKeySession.on('expirationUpdate', (eventInfo: drm.EventInfo) => {
53e41f4b71Sopenharmony_ci         console.log('expirationUpdate' + 'info:' + eventInfo.info + ' extraInfo:' + eventInfo.extraInfo);
54e41f4b71Sopenharmony_ci       });
55e41f4b71Sopenharmony_ci       ```
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ci    - Listen for key change events, which are triggered when a media key is changed.
58e41f4b71Sopenharmony_ci
59e41f4b71Sopenharmony_ci       ```ts
60e41f4b71Sopenharmony_ci       mediaKeySession.on('keysChange', (keyInfo : drm.KeysInfo[], newKeyAvailable:boolean) => {
61e41f4b71Sopenharmony_ci         for(let i = 0; i < keyInfo.length; i++){
62e41f4b71Sopenharmony_ci           console.log('keysChange' + 'info:' + keyInfo[i].keyId + ' extraInfo:' + keyInfo[i].value);
63e41f4b71Sopenharmony_ci         }
64e41f4b71Sopenharmony_ci       });
65e41f4b71Sopenharmony_ci       ```
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci4. Generate a media key request and process its response.
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci   ```ts
70e41f4b71Sopenharmony_ci   let initData = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
71e41f4b71Sopenharmony_ci   // Set optional data based on the DRM scheme.
72e41f4b71Sopenharmony_ci   let optionalData:drm.OptionsData[] = [{
73e41f4b71Sopenharmony_ci     name: "...",
74e41f4b71Sopenharmony_ci     value: "..."
75e41f4b71Sopenharmony_ci   }];
76e41f4b71Sopenharmony_ci   // The following example shows how to set an online media key request and response.
77e41f4b71Sopenharmony_ci   mediaKeySession.generateMediaKeyRequest("video/avc", initData, drm.MediaKeyType.MEDIA_KEY_TYPE_ONLINE, optionalData).then(async (licenseRequest) => {
78e41f4b71Sopenharmony_ci      console.info("generateMediaKeyRequest success", licenseRequest.mediaKeyRequestType, licenseRequest.data, licenseRequest.defaultURL);
79e41f4b71Sopenharmony_ci      // Send licenseRequest.data returned by the media key request to the DRM service through a network request to obtain a response and process the response.
80e41f4b71Sopenharmony_ci      let licenseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
81e41f4b71Sopenharmony_ci      mediaKeySession.processMediaKeyResponse(licenseResponse).then((mediaKeyId: Uint8Array) => {
82e41f4b71Sopenharmony_ci        console.info("processMediaKeyResponse success");
83e41f4b71Sopenharmony_ci      }).catch((err:BusinessError) =>{
84e41f4b71Sopenharmony_ci        console.info("processMediaKeyResponse err end", err.code);
85e41f4b71Sopenharmony_ci     });
86e41f4b71Sopenharmony_ci   }).catch((err:BusinessError) =>{
87e41f4b71Sopenharmony_ci     console.info("generateMediaKeyRequest err end", err.code);
88e41f4b71Sopenharmony_ci   });
89e41f4b71Sopenharmony_ci   // The following example shows how to set an offline media key request and response.
90e41f4b71Sopenharmony_ci   let offlineMediaKeyId = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
91e41f4b71Sopenharmony_ci   mediaKeySession.generateMediaKeyRequest("video/avc", initData, drm.MediaKeyType.MEDIA_KEY_TYPE_OFFLINE, optionalData).then((licenseRequest: drm.MediaKeyRequest) => {
92e41f4b71Sopenharmony_ci      console.info("generateMediaKeyRequest success", licenseRequest.mediaKeyRequestType, licenseRequest.data, licenseRequest.defaultURL);
93e41f4b71Sopenharmony_ci      // Send licenseRequest.data returned by the media key request to the DRM service through a network request to obtain a response and process the response.
94e41f4b71Sopenharmony_ci      let licenseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
95e41f4b71Sopenharmony_ci      mediaKeySession.processMediaKeyResponse(licenseResponse).then((mediaKeyId: Uint8Array) => {
96e41f4b71Sopenharmony_ci	offlineMediaKeyId = mediaKeyId;
97e41f4b71Sopenharmony_ci        console.info("processMediaKeyResponse success");
98e41f4b71Sopenharmony_ci      }).catch((err:BusinessError) =>{
99e41f4b71Sopenharmony_ci        console.info("processMediaKeyResponse err end", err.code);
100e41f4b71Sopenharmony_ci     });
101e41f4b71Sopenharmony_ci   }).catch((err:BusinessError) =>{
102e41f4b71Sopenharmony_ci     console.info("generateMediaKeyRequest err end", err.code);
103e41f4b71Sopenharmony_ci   });
104e41f4b71Sopenharmony_ci   ```
105e41f4b71Sopenharmony_ci
106e41f4b71Sopenharmony_ci5. (Optional) Check the media key status of the media key session.
107e41f4b71Sopenharmony_ci
108e41f4b71Sopenharmony_ci    ```ts
109e41f4b71Sopenharmony_ci    try {
110e41f4b71Sopenharmony_ci      let keyvalue: drm.MediaKeyStatus[] = mediaKeySession.checkMediaKeyStatus();
111e41f4b71Sopenharmony_ci      console.info("checkMediaKeyStatus success", keyvalue[0].value);
112e41f4b71Sopenharmony_ci    } catch (err) {
113e41f4b71Sopenharmony_ci      let error = err as BusinessError;
114e41f4b71Sopenharmony_ci      console.error(`checkMediaKeyStatus ERROR: ${error}`);
115e41f4b71Sopenharmony_ci    }
116e41f4b71Sopenharmony_ci    ```
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ci6. (Optional) Generate an offline media key release request and process its response.
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ci   ```ts
121e41f4b71Sopenharmony_ci   mediaKeySession.generateOfflineReleaseRequest(offlineMediaKeyId).then((OfflineReleaseRequest: Uint8Array) => {
122e41f4b71Sopenharmony_ci     console.info("generateOfflineReleaseRequest success", OfflineReleaseRequest);
123e41f4b71Sopenharmony_ci     // Send OfflineReleaseRequest returned by the offline media key release request to the DRM service through a network request to obtain a response and process the response.
124e41f4b71Sopenharmony_ci     let OfflineReleaseResponse = new Uint8Array([0x00, 0x00, 0x00, 0x00]);
125e41f4b71Sopenharmony_ci     mediaKeySession.processOfflineReleaseResponse(offlineMediaKeyId, OfflineReleaseResponse).then(() => {
126e41f4b71Sopenharmony_ci       console.info("processOfflineReleaseResponse success");
127e41f4b71Sopenharmony_ci     }).catch((err:BusinessError) =>{
128e41f4b71Sopenharmony_ci       console.info("processOfflineReleaseResponse err end", err.code);
129e41f4b71Sopenharmony_ci     });
130e41f4b71Sopenharmony_ci   }).catch((err:BusinessError) =>{
131e41f4b71Sopenharmony_ci     console.info("generateOfflineReleaseRequest err end", err.code);
132e41f4b71Sopenharmony_ci   });
133e41f4b71Sopenharmony_ci   ```
134e41f4b71Sopenharmony_ci
135e41f4b71Sopenharmony_ci7. (Optional) Restore offline media keys.
136e41f4b71Sopenharmony_ci
137e41f4b71Sopenharmony_ci   ```ts
138e41f4b71Sopenharmony_ci   // Restore the specified media key information to the media key session.
139e41f4b71Sopenharmony_ci   mediaKeySession.restoreOfflineMediaKeys(offlineMediaKeyId).then(() => {
140e41f4b71Sopenharmony_ci     console.log("restoreOfflineMediaKeys success.");
141e41f4b71Sopenharmony_ci   }).catch((err: BusinessError) => {
142e41f4b71Sopenharmony_ci     console.error(`restoreOfflineMediaKeys: ERROR: ${err}`);
143e41f4b71Sopenharmony_ci   });
144e41f4b71Sopenharmony_ci   ```
145e41f4b71Sopenharmony_ci
146e41f4b71Sopenharmony_ci8. (Optional) Obtain the content protection level of the media key session.
147e41f4b71Sopenharmony_ci
148e41f4b71Sopenharmony_ci    ```ts
149e41f4b71Sopenharmony_ci    try {
150e41f4b71Sopenharmony_ci      let contentProtectionLevel: drm.ContentProtectionLevel = mediaKeySession.getContentProtectionLevel();
151e41f4b71Sopenharmony_ci    } catch (err) {
152e41f4b71Sopenharmony_ci      let error = err as BusinessError;
153e41f4b71Sopenharmony_ci      console.error(`getContentProtectionLevel ERROR: ${error}`);
154e41f4b71Sopenharmony_ci    }
155e41f4b71Sopenharmony_ci   ```
156e41f4b71Sopenharmony_ci
157e41f4b71Sopenharmony_ci9. (Optional) Check whether secure decoding is required.
158e41f4b71Sopenharmony_ci
159e41f4b71Sopenharmony_ci    ```ts
160e41f4b71Sopenharmony_ci    try {
161e41f4b71Sopenharmony_ci      let status: boolean = mediaKeySession.requireSecureDecoderModule("video/avc");
162e41f4b71Sopenharmony_ci    } catch (err) {
163e41f4b71Sopenharmony_ci      let error = err as BusinessError;
164e41f4b71Sopenharmony_ci      console.error(`requireSecureDecoderModule ERROR: ${error}`);
165e41f4b71Sopenharmony_ci    }
166e41f4b71Sopenharmony_ci    ```
167e41f4b71Sopenharmony_ci
168e41f4b71Sopenharmony_ci10. (Optional) Clear the media keys of the media key session.
169e41f4b71Sopenharmony_ci
170e41f4b71Sopenharmony_ci    ```ts
171e41f4b71Sopenharmony_ci    try {
172e41f4b71Sopenharmony_ci       mediaKeySession.clearMediaKeys();
173e41f4b71Sopenharmony_ci    } catch (err) {
174e41f4b71Sopenharmony_ci      let error = err as BusinessError;
175e41f4b71Sopenharmony_ci      console.error(`clearMediaKeys ERROR: ${error}`);
176e41f4b71Sopenharmony_ci    }
177e41f4b71Sopenharmony_ci    ```
178