Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .changes/fix-concurrent-modification
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
patch type="fixed" "Fix concurrent modification on collection iteration during async operations"
10 changes: 5 additions & 5 deletions lib/src/core/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -539,8 +539,8 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
// re-publish all tracks
await localParticipant?.rePublishAllTracks();

for (var participant in _remoteParticipants) {
for (var pub in participant.trackPublications.values) {
for (var participant in _remoteParticipants.toList()) {
for (var pub in participant.trackPublications.values.toList()) {
if (pub.subscribed) {
pub.sendUpdateTrackSettings();
}
Expand Down Expand Up @@ -936,8 +936,8 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
final trackSids = <String>[];
final trackSidsDisabled = <String>[];

for (var participant in _remoteParticipants) {
for (var track in participant.trackPublications.values) {
for (var participant in _remoteParticipants.toList()) {
for (var track in participant.trackPublications.values.toList()) {
if (track.subscribed != autoSubscribe) {
trackSids.add(track.sid);
}
Expand Down Expand Up @@ -1084,7 +1084,7 @@ extension RoomHardwareManagementMethods on Room {
/// Set audio output device.
Future<void> setAudioOutputDevice(MediaDevice device) async {
if (lkPlatformIs(PlatformType.web)) {
for (final participant in _remoteParticipants) {
for (final participant in _remoteParticipants.toList()) {
for (final audioTrack in participant.audioTrackPublications) {
audioTrack.track?.setSinkId(device.deviceId);
}
Expand Down
5 changes: 3 additions & 2 deletions lib/src/core/signal_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -517,10 +517,11 @@ extension SignalClientInternalMethods on SignalClient {
// queue is empty
if (_queue.isEmpty) return;
// send requests
for (final request in _queue) {
final queueCopy = List.of(_queue);
_queue.clear();
for (final request in queueCopy) {
_sendRequest(request, enqueueIfReconnecting: false);
}
_queue.clear();
}

@internal
Expand Down
8 changes: 4 additions & 4 deletions lib/src/e2ee/e2ee_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ class E2EEManager {
await _listener?.cancelAll();
await _listener?.dispose();
_listener = null;
for (var frameCryptor in _frameCryptors.values) {
for (var frameCryptor in _frameCryptors.values.toList()) {
await frameCryptor.dispose();
}
_frameCryptors.clear();
Expand Down Expand Up @@ -178,7 +178,7 @@ class E2EEManager {
/// without encryption/decryption
Future<void> setEnabled(bool enabled) async {
_enabled = enabled;
for (var frameCryptor in _frameCryptors.entries) {
for (var frameCryptor in _frameCryptors.entries.toList()) {
await frameCryptor.value.setEnabled(enabled);
}
}
Expand All @@ -189,7 +189,7 @@ class E2EEManager {
/// if null, use local participant.
Future<void> setKeyIndex(int keyIndex, {String? participantIdentity}) async {
participantIdentity ??= _room?.localParticipant?.identity;
for (var item in _frameCryptors.entries) {
for (var item in _frameCryptors.entries.toList()) {
if (item.key.keys.first == participantIdentity) {
await item.value.setKeyIndex(keyIndex);
}
Expand All @@ -202,7 +202,7 @@ class E2EEManager {
/// @return the key index and -1 if not found
Future<int> getKeyIndex(String? participantIdentity) async {
participantIdentity ??= _room?.localParticipant?.identity;
for (var item in _frameCryptors.entries) {
for (var item in _frameCryptors.entries.toList()) {
if (item.key.keys.first == participantIdentity) {
return await item.value.keyIndex;
}
Expand Down
4 changes: 3 additions & 1 deletion lib/src/managers/event.dart
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,9 @@ abstract class EventsListenable<T> extends Disposable {
if (_listeners.isNotEmpty) {
// Stop listening to all events
logger.finer('${objectId} cancelling ${_listeners.length} listeners(s)');
for (final listener in _listeners) {
final listenersCopy = List.of(_listeners);
_listeners.clear();
for (final listener in listenersCopy) {
await listener.cancel();
}
}
Expand Down
2 changes: 1 addition & 1 deletion lib/src/track/web/_audio_html.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ Future<dynamic> startAudio(String id, rtc.MediaStreamTrack track) async {
}

Future<bool> startAllAudioElement() async {
for (final el in _audioElements.values) {
for (final el in _audioElements.values.toList()) {
if (el.instanceOfString('HTMLAudioElement')) {
final audio = el as web.HTMLAudioElement;
await audio.play().toDart;
Expand Down