@videosdk.live/react-native-sdk
Version:
<h1 align="center"> <img src="https://static.videosdk.live/videosdk_logo_website_black.png"/><br/> <p align="center"> Video SDK React Native App <br/> <a href="https://videosdk.live/">videosdk.live</a> </p> </h1>
127 lines (110 loc) • 3.26 kB
JavaScript
import {
RTCFrameCryptorFactory,
RTCFrameCryptorAlgorithm,
RTCFrameCryptorState
} from "@videosdk.live/react-native-webrtc";
export default class E2EEManager {
#frameCryptors = new Map();
keyProvider = null;
constructor(keyProvider) {
this.keyProvider = keyProvider;
}
findTrackCryptor(id) {
return this.#frameCryptors.get(id);
}
async setupE2EESender(producerInfo, e2eCallback) {
let frameCryptor = this.findTrackCryptor(producerInfo.id);
if (!frameCryptor) {
frameCryptor = this.createFrameCryptorForSender(
producerInfo.id,
producerInfo.rtpSender
);
this.#frameCryptors.set(producerInfo.id, frameCryptor);
frameCryptor.setEnabled(true);
frameCryptor.addEventListener('onframecryptorstatechanged', (event) => {
const state = event.state;
switch (state) {
case 'ok':
e2eCallback("EncryptionSuccess")
break;
case 'encryptionFailed':
e2eCallback("EncryptionFailed")
break;
case 'internalError':
e2eCallback("InternalError")
break;
default:
e2eCallback("UnknownState")
break;
}
})
// return frameCryptor;
}
}
createFrameCryptorForSender(producerId, sender) {
if (!this.keyProvider) {
console.error("KeyProvider is not set in E2EEManager");
return null;
}
try {
const frameCryptor = RTCFrameCryptorFactory.createFrameCryptorForRtpSender(
producerId,
sender,
RTCFrameCryptorAlgorithm.kAesGcm,
this.keyProvider.rtcKeyProvider
);
return frameCryptor;
} catch (error) {
throw error;
}
}
async setupE2EEReceiver(consumerInfo, e2eCallback) {
let frameCryptor = this.findTrackCryptor(consumerInfo.id);
if (!frameCryptor) {
frameCryptor = this.createFrameCryptorForReceiver(
consumerInfo.id,
consumerInfo.rtpReceiver
);
this.#frameCryptors.set(consumerInfo.id, frameCryptor);
frameCryptor.setEnabled(true);
frameCryptor.addEventListener('onframecryptorstatechanged', (event) => {
const state = event.state;
switch (state) {
case 'ok':
e2eCallback("DecryptionSuccess")
break;
case 'decryptionFailed':
e2eCallback("DecryptionFailed")
break;
case 'internalError':
e2eCallback("InternalError")
break;
default:
e2eCallback("UnknownState")
break;
}
})
// return frameCryptor;
}
}
createFrameCryptorForReceiver(consumerId, receiver) {
if (!this.keyProvider) {
console.error("KeyProvider is not set in E2EEManager");
return null;
}
return RTCFrameCryptorFactory.createFrameCryptorForRtpReceiver(
consumerId,
receiver,
RTCFrameCryptorAlgorithm.kAesGcm,
this.keyProvider.rtcKeyProvider
);
}
async closeCryptor(id) {
const frameCryptor = this.findTrackCryptor(id);
if (frameCryptor) {
this.#frameCryptors.delete(id);
await frameCryptor.setEnabled(false);
await frameCryptor.dispose();
}
}
}