@@ -18,15 +18,16 @@ import 'package:flutter_webrtc/flutter_webrtc.dart';
18
18
19
19
import '../core/room.dart' ;
20
20
import '../e2ee/events.dart' ;
21
+ import '../e2ee/options.dart' ;
21
22
import '../events.dart' ;
22
23
import '../extensions.dart' ;
23
24
import '../managers/event.dart' ;
25
+ import '../utils.dart' ;
24
26
import 'key_provider.dart' ;
25
27
26
28
class E2EEManager {
27
29
Room ? _room;
28
- final Map <String , FrameCryptor > _frameCryptors = {};
29
- final List <FrameCryptor > _senderFrameCryptors = [];
30
+ final Map <Map <String , String >, FrameCryptor > _frameCryptors = {};
30
31
final BaseKeyProvider _keyProvider;
31
32
final Algorithm _algorithm = Algorithm .kAesGcm;
32
33
bool _enabled = true ;
@@ -40,13 +41,15 @@ class E2EEManager {
40
41
_listener = _room! .createListener ();
41
42
_listener!
42
43
..on < LocalTrackPublishedEvent > ((event) async {
43
- var trackId = event.publication.sid;
44
- var participantId = event.participant.sid;
44
+ if (event.publication.encryptionType == EncryptionType .kNone ||
45
+ isSVCCodec (event.publication.track? .codec ?? '' )) {
46
+ // no need to setup frame cryptor
47
+ return ;
48
+ }
45
49
var frameCryptor = await _addRtpSender (
46
- event.publication.track! .sender! ,
47
- participantId,
48
- trackId,
49
- event.publication.track! .kind.name.toLowerCase ());
50
+ sender: event.publication.track! .sender! ,
51
+ identity: event.participant.identity,
52
+ sid: event.publication.sid);
50
53
if (kIsWeb && event.publication.track! .codec != null ) {
51
54
await frameCryptor.updateCodec (event.publication.track! .codec! );
52
55
}
@@ -63,21 +66,30 @@ class E2EEManager {
63
66
state: _e2eeStateFromFrameCryptoState (state),
64
67
));
65
68
};
66
- _senderFrameCryptors.add (frameCryptor);
67
69
})
68
70
..on < LocalTrackUnpublishedEvent > ((event) async {
69
- var trackId = event.publication.sid;
70
- var frameCryptor = _frameCryptors.remove (trackId);
71
- _senderFrameCryptors.remove (frameCryptor);
72
- await frameCryptor? .dispose ();
71
+ for (var key in _frameCryptors.keys.toList ()) {
72
+ if (key.keys.first == event.participant.identity &&
73
+ key.values.first == event.publication.sid) {
74
+ var frameCryptor = _frameCryptors.remove (key);
75
+ await frameCryptor? .setEnabled (false );
76
+ await frameCryptor? .dispose ();
77
+ }
78
+ }
73
79
})
74
80
..on < TrackSubscribedEvent > ((event) async {
75
- var trackId = event.publication.sid;
76
- var participantId = event.participant.sid;
77
- var frameCryptor = await _addRtpReceiver (event.track.receiver! ,
78
- participantId, trackId, event.track.kind.name.toLowerCase ());
81
+ var codec = event.publication.mimeType.split ('/' )[1 ];
82
+ if (event.publication.encryptionType == EncryptionType .kNone ||
83
+ isSVCCodec (codec)) {
84
+ // no need to setup frame cryptor
85
+ return ;
86
+ }
87
+ var frameCryptor = await _addRtpReceiver (
88
+ receiver: event.track.receiver! ,
89
+ identity: event.participant.identity,
90
+ sid: event.publication.sid,
91
+ );
79
92
if (kIsWeb) {
80
- var codec = event.publication.mimeType.split ('/' )[1 ];
81
93
await frameCryptor.updateCodec (codec.toLowerCase ());
82
94
}
83
95
frameCryptor.onFrameCryptorStateChanged = (trackId, state) {
@@ -95,16 +107,28 @@ class E2EEManager {
95
107
};
96
108
})
97
109
..on < TrackUnsubscribedEvent > ((event) async {
98
- var trackId = event.publication.sid;
99
- var frameCryptor = _frameCryptors.remove (trackId);
100
- await frameCryptor? .dispose ();
110
+ for (var key in _frameCryptors.keys.toList ()) {
111
+ if (key.keys.first == event.participant.identity &&
112
+ key.values.first == event.publication.sid) {
113
+ var frameCryptor = _frameCryptors.remove (key);
114
+ await frameCryptor? .setEnabled (false );
115
+ await frameCryptor? .dispose ();
116
+ }
117
+ }
101
118
});
102
119
}
103
120
}
104
121
105
- Future <void > ratchetKey () async {
106
- for (var frameCryptor in _senderFrameCryptors) {
107
- var newKey = await _keyProvider.ratchetKey (frameCryptor.participantId, 0 );
122
+ BaseKeyProvider get keyProvider => _keyProvider;
123
+
124
+ Future <void > ratchetKey ({String ? participantId, int ? keyIndex}) async {
125
+ if (participantId != null ) {
126
+ var newKey = await _keyProvider.ratchetKey (participantId, keyIndex);
127
+ if (kDebugMode) {
128
+ print ('newKey: $newKey ' );
129
+ }
130
+ } else {
131
+ var newKey = await _keyProvider.ratchetSharedKey (keyIndex: keyIndex);
108
132
if (kDebugMode) {
109
133
print ('newKey: $newKey ' );
110
134
}
@@ -121,54 +145,41 @@ class E2EEManager {
121
145
_frameCryptors.clear ();
122
146
}
123
147
124
- Future <FrameCryptor > _addRtpSender (RTCRtpSender sender, String participantId,
125
- String trackId, String kind) async {
126
- var pid = '$kind -sender-$participantId -$trackId ' ;
148
+ Future <FrameCryptor > _addRtpSender (
149
+ {required RTCRtpSender sender,
150
+ required String identity,
151
+ required String sid}) async {
127
152
var frameCryptor = await frameCryptorFactory.createFrameCryptorForRtpSender (
128
- participantId: pid ,
153
+ participantId: identity ,
129
154
sender: sender,
130
155
algorithm: _algorithm,
131
156
keyProvider: _keyProvider.keyProvider);
132
- _frameCryptors[trackId ] = frameCryptor;
157
+ _frameCryptors[{identity : sid} ] = frameCryptor;
133
158
await frameCryptor.setEnabled (_enabled);
134
- if (_keyProvider.options.sharedKey) {
135
- await _keyProvider.keyProvider
136
- .setKey (participantId: pid, index: 0 , key: _keyProvider.sharedKey! );
137
- await frameCryptor.setKeyIndex (0 );
138
- }
159
+ await frameCryptor.setKeyIndex (0 );
139
160
return frameCryptor;
140
161
}
141
162
142
- Future <FrameCryptor > _addRtpReceiver (RTCRtpReceiver receiver,
143
- String participantId, String trackId, String kind) async {
144
- var pid = '$kind -receiver-$participantId -$trackId ' ;
163
+ Future <FrameCryptor > _addRtpReceiver (
164
+ {required RTCRtpReceiver receiver,
165
+ required String identity,
166
+ required String sid}) async {
145
167
var frameCryptor =
146
168
await frameCryptorFactory.createFrameCryptorForRtpReceiver (
147
- participantId: pid ,
169
+ participantId: identity ,
148
170
receiver: receiver,
149
171
algorithm: _algorithm,
150
172
keyProvider: _keyProvider.keyProvider);
151
- _frameCryptors[trackId ] = frameCryptor;
173
+ _frameCryptors[{identity : sid} ] = frameCryptor;
152
174
await frameCryptor.setEnabled (_enabled);
153
- if (_keyProvider.options.sharedKey) {
154
- await _keyProvider.keyProvider
155
- .setKey (participantId: pid, index: 0 , key: _keyProvider.sharedKey! );
156
- await frameCryptor.setKeyIndex (0 );
157
- }
175
+ await frameCryptor.setKeyIndex (0 );
158
176
return frameCryptor;
159
177
}
160
178
161
179
Future <void > setEnabled (bool enabled) async {
162
180
_enabled = enabled;
163
181
for (var frameCryptor in _frameCryptors.entries) {
164
182
await frameCryptor.value.setEnabled (enabled);
165
- if (_keyProvider.options.sharedKey) {
166
- await _keyProvider.keyProvider.setKey (
167
- participantId: frameCryptor.key,
168
- index: 0 ,
169
- key: _keyProvider.sharedKey! );
170
- await frameCryptor.value.setKeyIndex (0 );
171
- }
172
183
}
173
184
}
174
185
0 commit comments