69 lines
2.2 KiB
Swift
69 lines
2.2 KiB
Swift
|
//
|
||
|
// 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)
|
||
|
}
|
||
|
}
|