Skip to content

Commit 1112331

Browse files
committed
fixes and update react-native-webrtc
1 parent d7b3b7d commit 1112331

File tree

11 files changed

+116
-69
lines changed

11 files changed

+116
-69
lines changed

ci/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"dependencies": {
1414
"@livekit/react-native": "*",
15-
"@livekit/react-native-webrtc": "^137.0.1",
15+
"@livekit/react-native-webrtc": "^137.0.2",
1616
"livekit-client": "^2.15.4",
1717
"react": "18.2.0",
1818
"react-native": "0.74.2"

ci/yarn.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2174,16 +2174,16 @@ __metadata:
21742174
languageName: node
21752175
linkType: hard
21762176

2177-
"@livekit/react-native-webrtc@npm:^137.0.1":
2178-
version: 137.0.1
2179-
resolution: "@livekit/react-native-webrtc@npm:137.0.1"
2177+
"@livekit/react-native-webrtc@npm:^137.0.2":
2178+
version: 137.0.2
2179+
resolution: "@livekit/react-native-webrtc@npm:137.0.2"
21802180
dependencies:
21812181
base64-js: 1.5.1
21822182
debug: 4.3.4
21832183
event-target-shim: 6.0.2
21842184
peerDependencies:
21852185
react-native: ">=0.60.0"
2186-
checksum: 3341aafe7d9d1deb345e47247faa020b2cb5f1adbded135a244f0f9285eed720c9f62325bbce0e21c1da755ae24ae6c69eb07728cece709560f615908bde43a9
2186+
checksum: c23467701c7dfb74e3b223dd955b20ba1586c2186383f5b2595fff9b65a36b2db0b660de9935e009b69bc5e0bbff047d0f598495f8464daae8db5f8d9f9b7c24
21872187
languageName: node
21882188
linkType: hard
21892189

@@ -3872,7 +3872,7 @@ __metadata:
38723872
"@babel/preset-env": ^7.20.0
38733873
"@babel/runtime": ^7.20.0
38743874
"@livekit/react-native": "*"
3875-
"@livekit/react-native-webrtc": ^137.0.1
3875+
"@livekit/react-native-webrtc": ^137.0.2
38763876
"@react-native/babel-preset": 0.74.84
38773877
"@react-native/eslint-config": 0.74.84
38783878
"@react-native/metro-config": 0.74.84

example/ios/Podfile.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ PODS:
2929
- ReactCommon/turbomodule/bridging
3030
- ReactCommon/turbomodule/core
3131
- Yoga
32-
- livekit-react-native-webrtc (137.0.1):
32+
- livekit-react-native-webrtc (137.0.2):
3333
- React-Core
34-
- WebRTC-SDK (= 137.7151.02)
34+
- WebRTC-SDK (= 137.7151.04)
3535
- RCT-Folly (2024.01.01.00):
3636
- boost
3737
- DoubleConversion
@@ -1220,7 +1220,7 @@ PODS:
12201220
- ReactCommon/turbomodule/core
12211221
- Yoga
12221222
- SocketRocket (0.7.0)
1223-
- WebRTC-SDK (137.7151.02)
1223+
- WebRTC-SDK (137.7151.04)
12241224
- Yoga (0.0.0)
12251225

12261226
DEPENDENCIES:
@@ -1426,7 +1426,7 @@ SPEC CHECKSUMS:
14261426
glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f
14271427
hermes-engine: 01d3e052018c2a13937aca1860fbedbccd4a41b7
14281428
livekit-react-native: 22180f283c63416a81f8765555fccc7a33f0a044
1429-
livekit-react-native-webrtc: 0ffe5a13d196f65d717f958a111399f4f6383102
1429+
livekit-react-native-webrtc: 3bb1be767c4e489f69bca662eba1c5e7b1e1be0d
14301430
RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47
14311431
RCTDeprecation: b03c35057846b685b3ccadc9bfe43e349989cdb2
14321432
RCTRequired: 194626909cfa8d39ca6663138c417bc6c431648c
@@ -1480,7 +1480,7 @@ SPEC CHECKSUMS:
14801480
RNCAsyncStorage: 0c357f3156fcb16c8589ede67cc036330b6698ca
14811481
RNScreens: b32a9ff15bea7fcdbe5dff6477bc503f792b1208
14821482
SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d
1483-
WebRTC-SDK: d20de357dcbf7c9696b124b39f3ff62125107e4b
1483+
WebRTC-SDK: 40d4f5ba05cadff14e4db5614aec402a633f007e
14841484
Yoga: ae3c32c514802d30f687a04a6a35b348506d411f
14851485

14861486
PODFILE CHECKSUM: b5aad0c7d12b2ea501eb822f98f00ca01d154bd9

example/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"postinstall": "patch-package"
1111
},
1212
"dependencies": {
13-
"@livekit/react-native-webrtc": "^137.0.1",
13+
"@livekit/react-native-webrtc": "^137.0.2",
1414
"@react-native-async-storage/async-storage": "^1.17.10",
1515
"@react-navigation/native": "^6.0.8",
1616
"@react-navigation/native-stack": "^6.5.0",

example/src/PreJoinPage.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ import type { RootStackParamList } from './App';
1414
import { useTheme } from '@react-navigation/native';
1515
import AsyncStorage from '@react-native-async-storage/async-storage';
1616

17-
const DEFAULT_URL = 'wss://example.livekit.cloud';
18-
const DEFAULT_TOKEN = 'your-token-here';
17+
const DEFAULT_URL = 'ws://192.168.11.3:7880';
18+
const DEFAULT_TOKEN =
19+
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjA1MjM4NTksImlkZW50aXR5IjoicGhvbmUiLCJpc3MiOiJBUElUTFdySzh0YndyNDciLCJuYmYiOjE3NTc5MzE4NTksInN1YiI6InBob25lIiwidmlkZW8iOnsicm9vbSI6Im15cm9vbSIsInJvb21Kb2luIjp0cnVlfX0.jpvzL9Mcqu1tS3dpITO-ffAyjzZtEvnq_p9ehD5B7RM';
1920
const DEFAULT_E2EE = false;
2021
const DEFAULT_E2EE_KEY = '';
2122

example/src/RoomPage.tsx

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ export const RoomPage = ({
6767
};
6868
}, []);
6969

70-
let { e2eeManager } = useRNE2EEManager({ sharedKey: e2eeKey });
70+
let { e2eeManager } = useRNE2EEManager({
71+
sharedKey: e2eeKey,
72+
dataChannelEncryption: true,
73+
});
7174
let e2eeOptions = e2ee ? { e2eeManager } : undefined;
7275

7376
return (
@@ -79,7 +82,7 @@ export const RoomPage = ({
7982
adaptiveStream: { pixelDensity: 'screen' },
8083
e2ee: e2eeOptions,
8184
}}
82-
audio={true}
85+
audio={false}
8386
video={true}
8487
>
8588
<RoomView navigation={navigation} e2ee={e2ee} />
@@ -107,24 +110,22 @@ const RoomView = ({ navigation, e2ee }: RoomViewProps) => {
107110
}, [room, e2ee]);
108111

109112
useIOSAudioManagement(room, true);
110-
// Setup room listeners
111-
const { send } = useDataChannel(
112-
(dataMessage: ReceivedDataMessage<string>) => {
113-
//@ts-ignore
114-
let decoder = new TextDecoder('utf-8');
115-
let message = decoder.decode(dataMessage.payload);
116113

114+
// Setup room listeners
115+
useEffect(() => {
116+
room.registerTextStreamHandler('lk.chat', async (reader, participant) => {
117+
let message = await reader.readAll();
117118
let title = 'Received Message';
118-
if (dataMessage.from != null) {
119-
title = 'Received Message from ' + dataMessage.from?.identity;
119+
if (participant != null) {
120+
title = 'Received Message from ' + participant.identity;
120121
}
121122
Toast.show({
122123
type: 'success',
123124
text1: title,
124125
text2: message,
125126
});
126-
}
127-
);
127+
});
128+
}, [room]);
128129

129130
const tracks = useTracks(
130131
[
@@ -229,17 +230,14 @@ const RoomView = ({ navigation, e2ee }: RoomViewProps) => {
229230
localParticipant.setScreenShareEnabled(enabled);
230231
}
231232
}}
232-
sendData={(message: string) => {
233+
sendData={async (message: string) => {
233234
Toast.show({
234235
type: 'success',
235236
text1: 'Sending Message',
236237
text2: message,
237238
});
238239

239-
//@ts-ignore
240-
let encoder = new TextEncoder();
241-
let encodedData = encoder.encode(message);
242-
send(encodedData, { reliable: true });
240+
room.localParticipant.sendText(message, { topic: 'lk.chat' });
243241
}}
244242
onSimulate={(scenario) => {
245243
room.simulateScenario(scenario);

example/yarn.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2172,16 +2172,16 @@ __metadata:
21722172
languageName: node
21732173
linkType: hard
21742174

2175-
"@livekit/react-native-webrtc@npm:^137.0.1":
2176-
version: 137.0.1
2177-
resolution: "@livekit/react-native-webrtc@npm:137.0.1"
2175+
"@livekit/react-native-webrtc@npm:^137.0.2":
2176+
version: 137.0.2
2177+
resolution: "@livekit/react-native-webrtc@npm:137.0.2"
21782178
dependencies:
21792179
base64-js: 1.5.1
21802180
debug: 4.3.4
21812181
event-target-shim: 6.0.2
21822182
peerDependencies:
21832183
react-native: ">=0.60.0"
2184-
checksum: 3341aafe7d9d1deb345e47247faa020b2cb5f1adbded135a244f0f9285eed720c9f62325bbce0e21c1da755ae24ae6c69eb07728cece709560f615908bde43a9
2184+
checksum: c23467701c7dfb74e3b223dd955b20ba1586c2186383f5b2595fff9b65a36b2db0b660de9935e009b69bc5e0bbff047d0f598495f8464daae8db5f8d9f9b7c24
21852185
languageName: node
21862186
linkType: hard
21872187

@@ -6103,8 +6103,8 @@ __metadata:
61036103
linkType: hard
61046104

61056105
"livekit-client@npm:^2.15.4":
6106-
version: 2.15.4
6107-
resolution: "livekit-client@npm:2.15.4"
6106+
version: 2.15.7
6107+
resolution: "livekit-client@npm:2.15.7"
61086108
dependencies:
61096109
"@livekit/mutex": 1.1.1
61106110
"@livekit/protocol": 1.39.3
@@ -6117,7 +6117,7 @@ __metadata:
61176117
webrtc-adapter: ^9.0.1
61186118
peerDependencies:
61196119
"@types/dom-mediacapture-record": ^1
6120-
checksum: 7ae2e2f5326c8f7925b359277fd12ddeefb0bc5069b0563a9e184f2b860351bf91733c1fa5fd7b65467b643776368058d485af888e2771fd68c61c409b950e05
6120+
checksum: e9740963eef9ddb7f50604d2918b7ca9e696c1d190b968cbf2cb75997b1e0d4fce25c795ae60b1c92785cd9a679b6d606688092f31a6a1aaefc27ec92fc87f0f
61216121
languageName: node
61226122
linkType: hard
61236123

@@ -6128,7 +6128,7 @@ __metadata:
61286128
"@babel/core": ^7.20.0
61296129
"@babel/preset-env": ^7.20.0
61306130
"@babel/runtime": ^7.20.0
6131-
"@livekit/react-native-webrtc": ^137.0.1
6131+
"@livekit/react-native-webrtc": ^137.0.2
61326132
"@react-native-async-storage/async-storage": ^1.17.10
61336133
"@react-native/babel-preset": 0.74.84
61346134
"@react-native/eslint-config": 0.74.84

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,13 @@
4343
],
4444
"dependencies": {
4545
"@livekit/components-react": "^2.8.1",
46+
"@livekit/mutex": "^1.1.1",
4647
"array.prototype.at": "^1.1.1",
4748
"event-target-shim": "6.0.2",
4849
"events": "^3.3.0",
4950
"loglevel": "^1.8.0",
5051
"promise.allsettled": "^1.0.5",
51-
"react-native-quick-base64": "2.1.1",
52+
"react-native-quick-base64": "^2.2.1",
5253
"react-native-url-polyfill": "^1.3.0",
5354
"typed-emitter": "^2.1.0",
5455
"web-streams-polyfill": "^4.1.0",
@@ -59,7 +60,7 @@
5960
"@babel/preset-env": "^7.20.0",
6061
"@babel/runtime": "^7.20.0",
6162
"@commitlint/config-conventional": "^16.2.1",
62-
"@livekit/react-native-webrtc": "^137.0.1",
63+
"@livekit/react-native-webrtc": "^137.0.2",
6364
"@react-native/babel-preset": "0.74.84",
6465
"@react-native/eslint-config": "0.74.84",
6566
"@react-native/metro-config": "0.74.84",
@@ -86,7 +87,7 @@
8687
"typescript": "5.0.4"
8788
},
8889
"peerDependencies": {
89-
"@livekit/react-native-webrtc": "^137.0.1",
90+
"@livekit/react-native-webrtc": "^137.0.2",
9091
"livekit-client": "^2.15.4",
9192
"react": "*",
9293
"react-native": "*"

src/e2ee/RNE2EEManager.ts

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
EncryptionEvent,
2222
type DecryptDataResponseMessage,
2323
type EncryptDataResponseMessage,
24+
Mutex,
2425
} from 'livekit-client';
2526
import type RNKeyProvider from './RNKeyProvider';
2627
import 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

Comments
 (0)