@@ -21,6 +21,7 @@ import {
2121 EncryptionEvent ,
2222 type DecryptDataResponseMessage ,
2323 type EncryptDataResponseMessage ,
24+ Mutex ,
2425} from 'livekit-client' ;
2526import type RNKeyProvider from './RNKeyProvider' ;
2627import type RTCEngine from 'livekit-client/dist/src/room/RTCEngine' ;
@@ -37,13 +38,14 @@ export default class RNE2EEManager
3738 private room ?: Room ;
3839 private frameCryptors : Map < string , RTCFrameCryptor > = new Map ( ) ;
3940 private keyProvider : RNKeyProvider ;
40- private dataPacketCryptor : RTCDataPacketCryptor ;
4141 private algorithm : RTCFrameCryptorAlgorithm =
4242 RTCFrameCryptorAlgorithm . kAesGcm ;
4343
4444 private encryptionEnabled : boolean = false ;
4545 private dataChannelEncryptionEnabled : boolean = false ;
4646
47+ private dataPacketCryptorLock = new Mutex ( ) ;
48+ private dataPacketCryptor : RTCDataPacketCryptor | undefined = undefined ;
4749 constructor (
4850 keyProvider : RNKeyProvider ,
4951 dcEncryptionEnabled : boolean = false
@@ -52,17 +54,19 @@ export default class RNE2EEManager
5254 this . keyProvider = keyProvider ;
5355 this . encryptionEnabled = false ;
5456 this . dataChannelEncryptionEnabled = dcEncryptionEnabled ;
55- this . dataPacketCryptor =
56- RTCDataPacketCryptorFactory . createDataPacketCryptor (
57- this . algorithm ,
58- this . keyProvider . rtcKeyProvider
59- ) ;
6057 }
6158
6259 get isEnabled ( ) : boolean {
6360 return this . encryptionEnabled ;
6461 }
6562 get isDataChannelEncryptionEnabled ( ) : boolean {
63+ console . log (
64+ 'isDataChannelEncryptionEnabled?' ,
65+ this . isEnabled ,
66+ this . encryptionEnabled ,
67+ this . dataChannelEncryptionEnabled ,
68+ this . isEnabled && this . dataChannelEncryptionEnabled
69+ ) ;
6670 return this . isEnabled && this . dataChannelEncryptionEnabled ;
6771 }
6872
@@ -101,7 +105,16 @@ export default class RNE2EEManager
101105 await frameCryptor . dispose ( ) ;
102106 }
103107 }
104- ) ;
108+ )
109+ . on ( RoomEvent . SignalConnected , ( ) => {
110+ if ( ! this . room ) {
111+ throw new TypeError ( `expected room to be present on signal connect` ) ;
112+ }
113+ this . setParticipantCryptorEnabled (
114+ this . room . localParticipant . isE2EEEnabled ,
115+ this . room . localParticipant . identity
116+ ) ;
117+ } ) ;
105118 }
106119
107120 private async setupE2EESender (
@@ -156,6 +169,32 @@ export default class RNE2EEManager
156169 this . keyProvider . setSifTrailer ( trailer ) ;
157170 }
158171
172+ private async getDataPacketCryptor ( ) : Promise < RTCDataPacketCryptor > {
173+ let dataPacketCryptor = this . dataPacketCryptor ;
174+ if ( dataPacketCryptor ) {
175+ return dataPacketCryptor ;
176+ }
177+
178+ let unlock = await this . dataPacketCryptorLock . lock ( ) ;
179+
180+ try {
181+ dataPacketCryptor = this . dataPacketCryptor ;
182+ if ( dataPacketCryptor ) {
183+ return dataPacketCryptor ;
184+ }
185+
186+ dataPacketCryptor =
187+ await RTCDataPacketCryptorFactory . createDataPacketCryptor (
188+ this . algorithm ,
189+ this . keyProvider . rtcKeyProvider
190+ ) ;
191+
192+ this . dataPacketCryptor = dataPacketCryptor ;
193+ return dataPacketCryptor ;
194+ } finally {
195+ unlock ( ) ;
196+ }
197+ }
159198 async encryptData (
160199 data : Uint8Array
161200 ) : Promise < EncryptDataResponseMessage [ 'data' ] > {
@@ -165,7 +204,10 @@ export default class RNE2EEManager
165204 }
166205
167206 let participantId = room . localParticipant . identity ;
168- let encryptedPacket = await this . dataPacketCryptor . encrypt (
207+
208+ let dataPacketCryptor = await this . getDataPacketCryptor ( ) ;
209+
210+ let encryptedPacket = await dataPacketCryptor . encrypt (
169211 participantId ,
170212 this . keyProvider . getLatestKeyIndex ( participantId ) ,
171213 data
@@ -196,7 +238,8 @@ export default class RNE2EEManager
196238 keyIndex,
197239 } satisfies RTCEncryptedPacket ;
198240
199- let decryptedData = await this . dataPacketCryptor . decrypt (
241+ let dataPacketCryptor = await this . getDataPacketCryptor ( ) ;
242+ let decryptedData = await dataPacketCryptor . decrypt (
200243 participantIdentity ,
201244 packet
202245 ) ;
@@ -249,11 +292,13 @@ export default class RNE2EEManager
249292 enabled : boolean ,
250293 participantIdentity : string
251294 ) : void {
295+ console . log ( 'setParticipantCryptorEnabled' , enabled , participantIdentity ) ;
252296 if (
253297 this . encryptionEnabled !== enabled &&
254298 participantIdentity === this . room ?. localParticipant . identity
255299 ) {
256300 this . encryptionEnabled = enabled ;
301+ console . log ( 'setting encryption enabled to ' , enabled ) ;
257302 this . emit (
258303 EncryptionEvent . ParticipantEncryptionStatusChanged ,
259304 enabled ,
0 commit comments