feat(iOS): rewrite DRM Module (#4136)
* minimal api * add suport for `getLicense` * update logic for obtaining `assetId` * add support for localSourceEncryptionKeyScheme * fix typo * fix pendingLicenses key bug * lint code * code clean * code clean * remove old files * fix tvOS build * fix errors loop * move `localSourceEncryptionKeyScheme` into drm params * add check for drm type * use DebugLog * lint * update docs * lint code * fix bad rebase * update docs * fix crashes on simulators * show error on simulator when using DRM * fix typos * code clean
This commit is contained in:
68
ios/Video/Features/DRMManager+OnGetLicense.swift
Normal file
68
ios/Video/Features/DRMManager+OnGetLicense.swift
Normal file
@@ -0,0 +1,68 @@
|
||||
//
|
||||
// DRMManager+OnGetLicense.swift
|
||||
// react-native-video
|
||||
//
|
||||
// Created by Krzysztof Moch on 14/08/2024.
|
||||
//
|
||||
|
||||
import AVFoundation
|
||||
|
||||
extension DRMManager {
|
||||
func requestLicenseFromJS(spcData: Data, assetId: String, keyRequest: AVContentKeyRequest) async throws {
|
||||
guard let onGetLicense else {
|
||||
throw RCTVideoError.noDataFromLicenseRequest
|
||||
}
|
||||
|
||||
guard let licenseServerUrl = drmParams?.licenseServer, !licenseServerUrl.isEmpty else {
|
||||
throw RCTVideoError.noLicenseServerURL
|
||||
}
|
||||
|
||||
guard let loadedLicenseUrl = keyRequest.identifier as? String else {
|
||||
throw RCTVideoError.invalidContentId
|
||||
}
|
||||
|
||||
pendingLicenses[loadedLicenseUrl] = keyRequest
|
||||
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
onGetLicense([
|
||||
"licenseUrl": licenseServerUrl,
|
||||
"loadedLicenseUrl": loadedLicenseUrl,
|
||||
"contentId": assetId,
|
||||
"spcBase64": spcData.base64EncodedString(),
|
||||
"target": self?.reactTag as Any,
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
func setJSLicenseResult(license: String, licenseUrl: String) {
|
||||
guard let keyContentRequest = pendingLicenses[licenseUrl] else {
|
||||
setJSLicenseError(error: "Loading request for licenseUrl \(licenseUrl) not found", licenseUrl: licenseUrl)
|
||||
return
|
||||
}
|
||||
|
||||
guard let responseData = Data(base64Encoded: license) else {
|
||||
setJSLicenseError(error: "Invalid license data", licenseUrl: licenseUrl)
|
||||
return
|
||||
}
|
||||
|
||||
do {
|
||||
try finishProcessingContentKeyRequest(keyRequest: keyContentRequest, license: responseData)
|
||||
pendingLicenses.removeValue(forKey: licenseUrl)
|
||||
} catch {
|
||||
handleError(error, for: keyContentRequest)
|
||||
}
|
||||
}
|
||||
|
||||
func setJSLicenseError(error: String, licenseUrl: String) {
|
||||
let rctError = RCTVideoError.fromJSPart(error)
|
||||
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
self?.onVideoError?([
|
||||
"error": RCTVideoErrorHandler.createError(from: rctError),
|
||||
"target": self?.reactTag as Any,
|
||||
])
|
||||
}
|
||||
|
||||
pendingLicenses.removeValue(forKey: licenseUrl)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user